2013-10-27 157 views
0

我已经创建了实例化,正确显示几何体,但其图形不正确。OpenGL - glDrawElementsInstanced - 片段着色器和不正确的颜色

我的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); 

} 

注:当我需要为折射器保存texVal和vNormal变量时,0.00001值因为调试而存在在我的应用程序内。

结果颜色不正确。型号是不是红色,而是黑色和白色(随机分布在三角形) - 只有少数的三角形是红色

enter image description here

+1

如果vNormal.x的值足够大,vNormal.x的负值仍可以抵消红色通道。你可以改变你的语句为fCol = vec4(1,0,0,1);确保不是这种情况? –

+0

@FullFrontalNudity啊...谢谢你..把你的评论作为答案,我会接受它 –

+0

我会避免在着色器中使用预处理器指令'#include'。虽然它不是GLSL的一部分,但存在一个扩展,它允许您用着色器字符串('GL_ARB_shading_language_include')替换此指令。显然GLSL没有文件系统的概念,所以与GLSL的'#include'预处理器扩展一起使用的名称指的是指定的着色器字符串('glNamedStringARB(...)')。如果这个扩展是核心的,你将会劫持一个完全有效的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)中取消红色。

相关问题