你好,對於問這樣一個具體問題感到抱歉。OpenGL,爲什麼此代碼不能按我的預期工作?
我有以下GLSL頂點着色器:
#version 140
uniform vec2 viewport_size;
in vec2 vertex_position;
in vec2 in_texture_uv;
varying vec2 texture_uv;
void main(void)
{
texture_uv = in_texture_uv;
gl_Position = vec4(vertex_position/viewport_size, 0, 1);
}
和相應的片段着色器:
#version 140
uniform sampler2D texture_image;
out vec4 out_frag_color;
varying vec2 texture_uv;
void main(void)
{
out_frag_color = texture(texture_image, texture_uv);
}
產生此輸出(注意左下角的小藍點):
奇怪的是,如果我替換
texture_uv = in_texture_uv;
與
texture_uv = vertex_position;
輸出變爲:(注意在底部和左側的邊界)。
最後,如果我寫:
texture_uv = vertex_position;
texture_uv = in_texture_uv;
輸出是正確的:,這沒有任何意義,我...
有人能解釋爲什麼這種事情發生?謝謝你的時間!
相關代碼片段:
float[] positionVboData = new float[] {
// X Y U V
0.0f, 0.0f, 0f, 0f,
50.0f, 0.0f, 1f, 0f,
50.0f, 25.0f, 1f, .5f,
0.0f, 50.0f, 0f, 1f,
};
。
// vertices
GL.GenBuffers(1, out verticesHandle);
GL.BindBuffer(BufferTarget.ArrayBuffer, verticesHandle);
GL.BufferData<float>(BufferTarget.ArrayBuffer, new IntPtr(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StaticDraw);
// vertices: vertex_position
GL.EnableVertexAttribArray(0);
GL.BindAttribLocation(program, 0, "vertex_position");
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, sizeof(float)*4, 0);
// vertices: texture_uv
GL.EnableVertexAttribArray(1);
GL.BindAttribLocation(program, 1, "in_texture_uv");
GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, sizeof(float)*4, sizeof(float) * 2);
質地:
我不認爲這應該是問題,但你應該避免混合'變化'/'屬性'(_deprecated_)和'in' /'出' –
好吧,我只是試圖用「出「在頂點着色器中,並在片段着色器中使用」in「。 沒有變化。 –
你想用'vertex_position/viewport_size'完成什麼?這不是轉換爲窗口空間的正確方法。 –