我在使用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);
OpenGL何時報告錯誤?着色器編譯?着色器鏈接?捆綁 ?畫畫 ?你能提供圍繞錯誤的代碼嗎? –
編輯顯示確切的錯誤來源(在渲染中)。 –
這表明shader.LocationTexture具有無效值。你應該檢查你初始化的那一行。否則,如果你不需要紋理,你也不需要紋理座標。 –