OpenGL - glDrawElementsInstanced - 片段着色器和不正确的颜色
Posted
技术标签:
【中文标题】OpenGL - glDrawElementsInstanced - 片段着色器和不正确的颜色【英文标题】:OpenGL - glDrawElementsInstanced - fragment shader and incorrect colors 【发布时间】:2013-10-27 18:12:28 【问题描述】:我创建了实例,可以正确显示几何图形,但其图形不正确。
我的 VS 是这样的
#version 410
#include "engine-variables.inc"
#include "functions.inc"
in vec3 POSITION;
in vec3 NORMAL;
in vec2 TEXCOORD0;
in mat4 INSTANCE_TRANSFORM;
out vec2 vTexCoord;
out vec3 vNormal;
void main()
gl_Position = CalcPositionInWorld_Instance(POSITION, INSTANCE_TRANSFORM);
vNormal = NORMAL;
vTexCoord.x = TEXCOORD0.x;
vTexCoord.y = 1.0 - TEXCOORD0.y;
注意:#include
由我的应用处理 - 不是 glsl 的一部分
我有简单的片段着色器
#version 410
in vec2 vTexCoord;
in vec3 vNormal;
out vec4 fCol;
uniform sampler2D en_texModel;
void main()
vec4 texVal = texture2D(en_texModel, vTexCoord);
fCol = vec4(1, 0, 0, 1) + 0.00001 * texVal + vec4(0.00001 * vNormal, 0);
注意:0.00001 值是因为调试,当我需要保存 texVal 和 vNormal 变量以在我的应用程序中进行折射时。
结果颜色不正确。模型不是红色,而是黑色和白色(随机分布在三角形上) - 只有少数三角形是红色的
【问题讨论】:
vNormal.x 的负值仍然可以抵消红色通道,如果它足够大的话。你能把你的陈述改成 fCol = vec4(1, 0, 0, 1);确保不是这种情况? @FullFrontalNudity 啊...谢谢您..把您的评论作为答案,我会接受它 我会避免在着色器中使用预处理器指令#include
。虽然它不是 GLSL 的一部分,但存在一个扩展,允许您用着色器字符串 (GL_ARB_shading_language_include
) 替换此指令。显然 GLSL 没有文件系统的概念,因此与 GLSL 的 #include
预处理器扩展一起使用的名称指的是命名着色器字符串 (glNamedStringARB (...)
)。如果这个扩展成为核心,你将劫持一个完全有效的 GLSL 保留的预处理器指令。将_
附加到自定义指令的末尾可以避免这种情况。
@AndonM.Coleman 我的大多数着色器都来自 HLSL,其中包含存在。我没有单个着色器,我已经构建它们以使用具有我的文件系统概念的其他文件。所以唯一的缺点可能是什么时候 include 将成为 glsl 的官方部分。否则,我根本看不到任何问题。
@MartinPerry 我想你误解了我的意思,GLSL 的#include
指令不使用基于磁盘的文件系统并不是这里的问题。问题是 GLSL 已经有一个名为 #include
的预处理器指令。现在它只是一个扩展,但是你的着色器使用了一个将来会被未扩展的 GLSL 预处理器保留的词。最好通过重命名自定义指令来避免这样的冲突。
【参考方案1】:
罪魁祸首是这条线:
fCol = vec4(1, 0, 0, 1) + 0.00001 * texVal + vec4(0.00001 * vNormal, 0);
如果 texVal.x 或 vNormal.x 较大且为负数,仍然会导致黑色,从而抵消 vec4(1,0,0,1) 中的红色。
【讨论】:
以上是关于OpenGL - glDrawElementsInstanced - 片段着色器和不正确的颜色的主要内容,如果未能解决你的问题,请参考以下文章