Bonjour et désolé de poser une question si spécifique.OpenGL, pourquoi ce code ne fonctionne pas comme prévu?
je le vertex shader GLSL suivant:
#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);
}
et le fragment shader correspondant:
#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);
}
qui produit cette sortie (notez le petit point bleu sur le coin inférieur gauche): La chose étrange est que si je remplace
La chose étrange est que si je remplacetexture_uv = in_texture_uv;
avec
texture_uv = vertex_position;
la sortie devient: (noter les frontières sur le fond et à gauche).
Et enfin, si j'écris:
texture_uv = vertex_position;
texture_uv = in_texture_uv;
la sortie est correcte: , et cela ne fait aucun sens pour moi pas ...
Quelqu'un pourrait-il expliquer pourquoi cette chose arrive? Merci pour votre temps!
extraits de code pertinents:
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);
Texture:
Je ne pense pas que cela devrait être le problème, mais vous devriez éviter de mélanger 'vary' /' attribute' (_deprecated_) et 'in' /' out' –
Ok, j'ai juste essayé de remplacer "variable" par "out" "dans le vertex shader, et avec" in "dans le fragment shader. Aucun changement du tout. –
Qu'est-ce que vous essayez d'accomplir avec 'vertex_position/viewport_size'? Ce n'est pas la bonne façon de transformer en fenêtre-espace. –