片段着色器处理纹理数据并通过

时间:2016-12-15 20:57:04

标签: opengl glsl shader fragment-shader

我试图在片段着色器中使用原子计数器。 基本上我只显示纹理四边形,需要对纹理数据进行计算,并显示未改变的纹理。 我开始编写一个简单的传递片段着色器,但显示的纹理是纯色。要么我缺少某些东西,我也不确定是否也使用顶点着色器,因为我只处理纹理,对我来说似乎已经过时了。

片段着色器代码:

#version 420
 uniform vec2 texture_coordinate; uniform sampler2D my_color_texture;
 void main() {   
    gl_FragColor = texture2D(my_color_texture, texture_coordinate);
 }

渲染管道 - 使用shaprGL,但它易于阅读:

gl.Enable(OpenGL.GL_TEXTURE_2D);
String s = "my_color_texture"; //name of the texture variable in shader

gl.UseProgram(graycounter); // graycounter is a compiled/linked shader
GLint my_sampler_uniform_location = gl.GetUniformLocation(graycounter, s);

gl.ActiveTexture(OpenGL.GL_TEXTURE0);
gl.BindTexture(OpenGL.GL_TEXTURE_2D, ((dTexture)texture).texture); //texture id, working without shader on
gl.Uniform1ARB(my_sampler_uniform_location, 0);

gl.Begin(OpenGL.GL_QUADS); // show the rectangle
gl.Color(1.0f, 1.0f, 1.0f);
gl.TexCoord(0.0f, 0.0f); gl.Vertex(0.0f, 0.0f, 0.0f); // Bottom Left Of The Texture and Quad
gl.TexCoord(1.0f, 0.0f); gl.Vertex(w, 0.0f, 0.0f);  // Bottom Right Of The Texture and Quad
gl.TexCoord(1.0f, 1.0f); gl.Vertex(w, h, 0.0f);   // Top Right Of The Texture and Quad
gl.TexCoord(0.0f, 1.0f); gl.Vertex(0.0f, h, 0.0f);  // Top Left Of The Texture and Quad
gl.End();

gl.UseProgram(0);

2 个答案:

答案 0 :(得分:1)

uniform vec2 texture_coordinate;

统一值不会从片段变为片段;这就是为什么他们被称为“制服”。您可能想要in而不是uniform

当然,由于您使用的是旧版功能,因此您可能需要挂钩gl_TexCoord[]数组。这就是传统的顶点处理器(因为你没有使用VS)会吐出来的。纹理坐标0将映射到gl_TexCoord[0]

答案 1 :(得分:0)

我最终确定了它,如果有人有同样的问题,这里是顶点着色器 - 注意没有min.version     out vec4 texCoord; void main(void) { gl_Position = ftransform(); texCoord=gl_TextureMatrix[0] * gl_MultiTexCoord0; }

和片段着色器 - 使用版本#440来支持原子计数器      #version 440 layout (binding = 0, offset = 0) uniform atomic_uint g1; uniform sampler2D my_color_texture; in vec4 texCoord; out vec4 fragColour; void main() { fragColour = texture2D(my_color_texture,texCoord.xy); if (abs(fragColour.r*255 - 0)<1) atomicCounterIncrement(g1); }