为啥 glColorPointer 不给三角形着色 - 以及 opengl es 的其他奇怪的东西

Posted

技术标签:

【中文标题】为啥 glColorPointer 不给三角形着色 - 以及 opengl es 的其他奇怪的东西【英文标题】:Why does glColorPointer not color the triangle - and other weird things with opengl es为什么 glColorPointer 不给三角形着色 - 以及 opengl es 的其他奇怪的东西 【发布时间】:2011-04-12 21:46:26 【问题描述】:

我对 OpenGL 不是很熟悉,但我尝试在屏幕上绘制一个简单的三角形。每个角落都有不同的颜色。类似于基本教程的东西...问题是,

    三角形正好是白色的。 三角形仅在模拟器中可见,在我的 HTC Desire 上不可见。

我的 GLView 课程:

public class GLView extends GLSurfaceView implements GLSurfaceView.Renderer 

private FloatBuffer vertexBuff;
private FloatBuffer colorBuff;

public static FloatBuffer makeFloatBuffer(float[] arr)

    ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);
    bb.order(ByteOrder.nativeOrder());
    FloatBuffer fb = bb.asFloatBuffer();
    fb.put(arr);
    fb.position(0);
    return fb;


public GLView(Context context) 
    super(context);
    setRenderer(this);


@Override
public void onDrawFrame(GL10 gl) 
    gl.glClearColor(0, 0, 0, 0);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    
    
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glColorPointer(3, GL10.GL_FLOAT, 0, makeFloatBuffer(new float[]  1, 0, 0,
                                                                         0, 1, 0,
                                                                         0, 0, 1 ));
    
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);       
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, makeFloatBuffer(new float[]  0, 0, 0,
                                                                          0, 1, 0,
                                                                          1, 1, 0));
    
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);


@Override
public void onSurfaceChanged(GL10 gl, int width, int height) 
    gl.glViewport(0, 0, width, height);     


@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) 
    


有什么建议吗?

【问题讨论】:

【参考方案1】:

我猜 OpenGL 状态可能有些不确定,因为您不提供投影或模型视图矩阵。但我猜主要是因为我对 OpenGL 并不完全熟悉。无论如何,我通过将 alpha 值添加到颜色数组来让你的代码工作

    gl.glColorPointer(4, GL10.GL_FLOAT, 0, makeFloatBuffer(new float[]  1, 0, 0, 1,
                                                                         0, 1, 0, 1,
                                                                         0, 0, 1, 1 ));

提供上述转换矩阵可能会在设备上发挥作用。

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) 
    gl.glViewport(0, 0, width, height);

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluOrtho2D(gl, -1.0f, 1.0f, -1.0f, 1.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    

【讨论】:

是的,这就是工作!我只是不明白,为什么我必须使用带有 4 而不是 3 颜色值的 glColorPointer。文档没有提及任何相关内容。 我没有尝试过,但也许在渲染三角形之前通过 glColor4f 设置“默认”颜色也可以解决问题。我的意思是您的颜色数组应该覆盖实际颜色值,但如果您没有在颜色数组中单独提供它,则可能会从当前颜色中选择 alpha。我希望颜色数组默认使用 alpha 值 1.0f,但我想知道真的是这样。 @DanielBişar,这可能是因为您需要对齐颜色数据(虽然float 是 4 个字节,但根据this,这是一个常见错误)。 这篇文章已有 10 年历史了:D - 不知道是什么问题。可能是您所说的或设备驱动程序问题。

以上是关于为啥 glColorPointer 不给三角形着色 - 以及 opengl es 的其他奇怪的东西的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个在opengl中绘制三角形的着色器不会多次运行

如何从PyOpenGL中的单个数组中提取glVertexPointer()和glColorPointer()的数据?

为啥片段着色器没有附加?

为啥我的三角形在镶嵌后不显示? OpenGL

Cg 和 OpenGL 3

Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形