OpenGL三角形上色问题:已绘三角形并设红背景但无法上色
问题原因与解决方法
你的三角形无法上色的核心原因是OpenGL固定管线的光照功能默认处于启用状态,此时渲染会优先使用材质属性计算颜色,完全忽略顶点颜色数组中的值,所以三角形显示默认的黑色材质。
解决步骤(二选一)
方案1:直接禁用光照(简单高效,适合不需要光照的场景)
在绘制前添加glDisable(GL_LIGHTING);,让顶点颜色直接生效:
const GLfloat vertices[] = { vertex1_s, vertex1_t, 0, vertex2_s, vertex2_t, 0, vertex3_s, vertex3_t, 0 }; glClearColor(1,0,0,0); glClear(GL_COLOR_BUFFER_BIT); // 关键:禁用光照,顶点颜色即可生效 glDisable(GL_LIGHTING); const GLfloat colors[] = { 0, 0, 1, 0, 0, 1, 0, 0, 1 }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3, GL_FLOAT, 0, colors); glDrawArrays(GL_TRIANGLES, 0, 3); eglSwapBuffers(dpy, surface);
方案2:保留光照,让顶点颜色影响材质(适合需要光照的场景)
启用颜色材质功能,让顶点颜色同步到材质的环境光和漫反射属性:
const GLfloat vertices[] = { vertex1_s, vertex1_t, 0, vertex2_s, vertex2_t, 0, vertex3_s, vertex3_t, 0 }; glClearColor(1,0,0,0); glClear(GL_COLOR_BUFFER_BIT); // 关键:启用颜色材质,让顶点颜色影响材质属性 glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); const GLfloat colors[] = { 0, 0, 1, 0, 0, 1, 0, 0, 1 }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3, GL_FLOAT, 0, colors); glDrawArrays(GL_TRIANGLES, 0, 3); eglSwapBuffers(dpy, surface);
内容的提问来源于stack exchange,提问作者Shekhar Chauhan
相关产品推荐
相关产品推荐

