为啥 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 的其他奇怪的东西的主要内容,如果未能解决你的问题,请参考以下文章