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 - 片段着色器和不正确的颜色的主要内容,如果未能解决你的问题,请参考以下文章

glfw 包含了opengl吗

qt opengl的图形怎么刷新

OpenGL是啥?

OpenGL 4 采用

OpenGL - 002_2OpenGL 常见专业名词解析

如何使用 OpenGL 保存 OpenGL 绘制?