解决方案:修正错字(glColor -> gl_Color)
我有一个灰度颜色的纹理和一个 0f 或 1f 的 alpha 通道(两者之间没有)。我想以绿色绘制纹理,但仅在 alpha 为 1 时绘制,当 alpha 为 0 时不绘制任何内容。要选择绿色,所以我将 glColor4fv green_opaque 设置为 GLfloat green_opaque .5 1 .5 1
现在,我使用这个片段着色器:
const char * fragment_shader_source=
"uniform sampler2D tex;"
"void main() {"
" vec4 color=texture2D(tex,gl_TexCoord[0].st);"
" if (color[3]!=0) {"
#ifdef A
" gl_FragColor=color*glColor;"
#else
" gl_FragColor=color;"
#endif
" } else {"
" discard;"
" }"
"}"
;
如果没有 A,着色器会尊重 Alpha 通道,但渲染的纹理显然仍然是灰色的。现在,我定义了 A 并且着色器现在根据需要对纹理进行着色,但是现在忽略了 alpha 通道。
我在这里做错了什么?还是驱动程序/硬件错误?
OpenGL 供应商字符串:Advanced Micro Devices, Inc. OpenGL 渲染器字符串:AMD Radeon HD 6570 OpenGL 版本字符串:4.2.11554 兼容性配置文件上下文 OpenGL 着色语言版本字符串:4.20
回答:
“您是说着色器中的“gl_Color”而不是“glColor”吗?”
正是这个问题 - 顺便说一句,我昨天已经想通了,但由于 java 脚本问题,我还不能发布答案。
添加下划线后,着色器就完成了它应该做的事情。