2015-06-27 100 views
-1

我在使用OpenGL 4.4編寫OpenTK的2D遊戲。使用顏色和紋理UV座標和矩陣我可以成功地繪製頂點之間的紋理與頂點着色器:片段着色引發的OpenGL錯誤

公共常量字符串vertexShaderDefaultSrc = @」 的#Version 330

 uniform mat4 MVPMatrix; 

     layout (location = 0) in vec2 Position; 
     layout (location = 1) in vec2 Texture; 
     layout (location = 2) in vec4 Colour; 

     out vec2 InTexture; 
     out vec4 OutColour; 

     void main() 
     { 
      gl_Position = MVPMatrix * vec4(Position, 0, 1); 
      InTexture = Texture; 
      OutColour = Colour; 
     }"; 

和片段着色器:

public const string fragmentShaderDefaultSrc = 
    @" 
    #version 330 

    uniform sampler2D Sampler; 

    in vec2 InTexture; 
    in vec4 OutColour; 

    out vec4 OutFragColor; 

    void main() 
    { 
     OutFragColor = texture(Sampler, InTexture) * OutColour; 

     //Alpha test 
     if(OutFragColor.a <= 0) 
      discard; 
    } 
    "; 

但是如果我想繪製一個純色而不是紋理,我使用這個着色器(使用相同的頂點,傳遞不會被使用的UV座標):

public const string fragmentShaderSolidColourSrc = 
    @" 
    #version 330 

    uniform sampler2D Sampler; 

    in vec2 InTexture; 
    in vec4 OutColour; 

    out vec4 OutFragColor; 

    void main() 
    { 
     OutFragColor = OutColour; 

     //Alpha test 
     if(OutFragColor.a <= 0) 
      discard; 
    } 
    "; 

現在這個工作很好,但OpenGL報告錯誤 - GL_INVALID_VALUE。它畫得很好,一切似乎都起作用,但理想情況下,我希望OpenGL在這種情況下無錯,這樣我就可以捕捉到真正的錯誤。我會很感激任何幫助,並且可以共享更詳細的着色器如何編譯或使用,如果這有幫助的 - 我不明白的是默認着色器如何工作,但純色不。

我已經找到了錯誤的確切來源,我的渲染調用(着色器編譯沒有問題)

GL.EnableVertexAttribArray(shader.LocationPosition); 
     GL.VertexAttribPointer(shader.LocationPosition, 2, VertexAttribPointerType.Float, false, Stride, 0); 
     //-----everything up to here is fine 

     //this line throws an error 
     GL.EnableVertexAttribArray(shader.LocationTexture); 
     //as does this line 
     GL.VertexAttribPointer(shader.LocationTexture, 2, VertexAttribPointerType.Float, false, Stride, 8); 


     //this is all ok 
     GL.EnableVertexAttribArray(shader.LocationColour); 
     GL.VertexAttribPointer(shader.LocationColour, 4, VertexAttribPointerType.UnsignedByte, true, Stride, 16); 

     //ok 
     GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer); 
     GL.DrawArrays(DrawType, 0, Vertices.Length); 

     //ok 
     GL.DisableVertexAttribArray(shader.LocationPosition); 

     //this line throws error 
     GL.DisableVertexAttribArray(shader.LocationTexture); 

     //this is ok 
     GL.DisableVertexAttribArray(shader.LocationColour); 
+0

OpenGL何時報告錯誤?着色器編譯?着色器鏈接?捆綁 ?畫畫 ?你能提供圍繞錯誤的代碼嗎? –

+0

編輯顯示確切的錯誤來源(在渲染中)。 –

+0

這表明shader.LocationTexture具有無效值。你應該檢查你初始化的那一行。否則,如果你不需要紋理,你也不需要紋理座標。 –

回答

0

在我看來,一些測試後(將是不錯的有這樣的驗證),如果編譯器不會使用像紋理座標這樣的變量,所以調用它來獲取它的位置返回-1。只需檢查locationTexture是否爲-1,然後不綁定locationTexture等,如果這樣可以解決我的問題。

+1

是的,情況正是如此。只有_active_屬性(與制服相同)確實有位置。着色器編譯器/鏈接器通常非常積極地優化不影響最終輸出的所有內容。請注意,對於制服來說,設置位置爲-1的制服明確定義爲不是錯誤(它只是默默忽略),但對於屬性而言,這是不同的。您可以查詢的位置是帶符號的int,可能是-1,但頂點attrib函數的索引是無符號的,並且使用[0,max_attrib-1]範圍之外的索引始終是錯誤。 – derhass

+0

正是我在找的,謝謝你 –