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