2012-11-02 38 views
1

我正在爲紋理映射編寫GLSL程序。我有一個奇怪的問題。在我的頂點着色器中,我嘗試將紋理座標vec2作爲變化片段着色器傳遞。在同一編程的差異着色器中,我做了同樣的工作。但對於這種紋理它不起作用。如果我評論這條線,那麼一切正常。我不知道爲什麼會發生這種情況。將屬性分配給頂點着色器中的變化時GLSL中的奇怪錯誤

這是頂點着色器:

attribute vec4 position; 
attribute vec4 color1; 
attribute vec4 normal; 
attribute vec2 texCoord; 

uniform mat4 model; //passed to shader 
uniform mat4 projection; //passed to shader 
uniform mat4 view; // passed to shader 
uniform mat4 normalMatrix; //passed to shader 
uniform mat4 worldNormalMatrix; 
uniform vec3 eyePos; 

varying vec4 pcolor; 
varying vec3 fNormal; 
varying vec3 v; 
varying mat4 modelMat; 
varying mat4 viewMat; 
varying mat4 projectionMat; 
varying vec2 texCoordinate; 
varying vec3 reflector; 

void main() 
{  
     //texCoordinate = texCoord; // If I uncomment this, then I get wrong output. but the same thing works in a diff shader!! 
     mat4 projectionModelView; 
     vec4 N; 
     vec3 WorldCameraPosition = vec3(model*vec4(eyePos,1.0)); 
     vec3 worldPos = vec3(model*position); 
     vec3 worldNorm = normalize(vec3(worldNormalMatrix*normal)); 
     vec3 worldView = normalize(vec3(WorldCameraPosition-worldPos)); 
     reflector = reflect(-worldView, worldNorm);  
     projectionMat = projection; 
     modelMat=model; 
     viewMat=view; 
     N=normalMatrix*normal;  
     fNormal = vec3(N); //need to multiply this with normal matrix 
     projectionModelView=projection*view*model; 
     v=vec3(view*model*position); // v is the position at eye space for each vertex passed to frag shader 
     gl_Position = projectionModelView * position; // calculate clip space position  
} 
+0

你是什麼意思不工作?你檢查着色器編譯和鏈接的結果嗎?你檢查過glGetError嗎? – Tim

+0

你好, 不工作意味着它給了我一個白色的大圓圈黑屏。我其實對調試沒有太多的想法。此外,我只是不明白爲什麼這不起作用,導致在同一編程的差異陰影,我做了,並且工作正常。目前我正試圖通過互聯網找到這類錯誤的相關信息。 – mindbender

+1

那麼如果你對調試沒有太多的想法,那麼該學習了。可能有100種不同的事情可能會導致錯誤,從而導致無法正常工作。首先在整個代碼中插入一些glGetError,並在任何地方查看它是否爲非零。 – Tim

回答

7
varying vec4 pcolor; 
varying vec3 fNormal; 
varying vec3 v; 
varying mat4 modelMat; 
varying mat4 viewMat; 
varying mat4 projectionMat; 
varying vec2 texCoordinate; 
varying vec3 reflector; 

這是17個總變化的向量。這對於大多數2.1級硬件來說太多了(他們通常只支持16個硬件)。這可能就是爲什麼當你取消註釋該行時它「不工作」的原因,因爲你的頂點着色器會忽略任何你實際上沒有寫入的變化。

您不應該在所有處傳遞這些矩陣。他們是制服;根據定義,它們不會從頂點變爲頂點。片段着色器也可以完全訪問同樣的制服。所以如果你需要使用它們,只需在你的片段着色器中聲明它們即可。

+0

嗨尼科爾, 你是絕對正確的..非常感謝答覆..它現在的工作.. – mindbender

相關問題