You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:30:28