2016-04-15 7 views
0

Ich habe eine einfache RGBA-Textur, die ich auf einem Rechteck/Quad in OpenGL projizieren werde.OpenGL Fragment Shader in einer Textur

Ich möchte jedoch einige Operationen in den RGB-Pixeln dieser Textur durchführen, z. B. möchte ich, dass die angezeigte Farbe eine Funktion der RGB-Pixel des Originalbildes ist.

Meine Fragen sind: Kann ich einen Fragment-Shader auf eine 2D-Textur anwenden? Und wenn ich kann, wie greife ich auf den rgb-Wert des ursprünglichen Texturbildes zu?

Jede Hilfe wäre willkommen.

Antwort

0

Sie können das sicherlich tun. Rendern Sie den Quad wie gewohnt und senden Sie die Textur als sampler2D Uniform an den Fragment-Shader.

Im Fragment-Shader können Sie dann entweder texture oder texelFetch anrufen. texture Proben Ihre Textur und texelFetch sehen, ohne eine Interpolation einen RGB-Texels von der Textur usw.

Hier ist ein Beispiel dafür, was Ihr Fragment-Shader aussehen könnte:

Fragment-Shader

#version 330 core 

uniform vec2 resolution; 
uniform sampler2D myTexture; 

out vec3 color; 

void main() 
{ 
    vec2 pos = gl_FragCoord.xy/resolution.xy; 
    pos.y = resolution.y - pos.y; 

    color = texture(myTexture, pos).xyz; 
} 

Und dann auf der Anwendungsseite:

Initialisierung

glGenTextures(1, &m_textureID); 
glBindTexture(GL_TEXTURE_2D, m_textureID); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_imageWidth, m_imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, pImage); 

m_textureUniformID = glGetUniformLocation(m_programID, "myTexture"); 

Render loop

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, m_textureID); 
glUniform1i(m_textureUniformID, 0);