tutorial touchdesigner shadertoy shaders descargar opengl glsl

touchdesigner - ¿Cuál es la mejor manera de dibujar un quad de pantalla completa en OpenGL 3.2?



opengl shader descargar (5)

Lo siguiente proviene de la función de dibujar de la clase que dibuja las texturas fbo en un cuadrante alineado con la pantalla.

Gl.glUseProgram(shad); Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, vbo); Gl.glEnableVertexAttribArray(0); Gl.glEnableVertexAttribArray(1); Gl.glVertexAttribPointer(0, 3, Gl.GL_FLOAT, Gl.GL_FALSE, 0, voff); Gl.glVertexAttribPointer(1, 2, Gl.GL_FLOAT, Gl.GL_FALSE, 0, coff); Gl.glActiveTexture(Gl.GL_TEXTURE0); Gl.glBindTexture(Gl.GL_TEXTURE_2D, fboc); Gl.glUniform1i(tileLoc, 0); Gl.glDrawArrays(Gl.GL_QUADS, 0, 4); Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0); Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, 0); Gl.glUseProgram(0);

El cuadrante real en sí y los coords se obtienen de:

private float[] v=new float[]{ -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };

El enlace y la configuración de los vbo''s los dejo a ustedes.

El sombreador de vértices:

#version 330 layout(location = 0) in vec3 pos; layout(location = 1) in vec2 coord; out vec2 coords; void main() { coords=coord.st; gl_Position=vec4(pos, 1.0); }

Debido a que la posición es cruda, es decir, no multiplicada por ninguna matriz, el -1, -1 :: 1, 1 del cuadrante encaja en la ventana gráfica. Busque el tutorial de Alfonse vinculado a cualquiera de sus publicaciones en openGL.org.

Estoy haciendo fundido de rayos en el sombreador de fragmentos. Puedo pensar en un par de formas de dibujar un quad de pantalla completa para este propósito. Dibuje un cuadrante en el espacio del clip con la matriz de proyección establecida en la matriz de identidad, o use el sombreador de geometría para convertir un punto en una franja triangular. El primero usa el modo inmediato, obsoleto en OpenGL 3.2. Lo último lo utilizo por novedad, pero todavía usa el modo inmediato para dibujar un punto.


No es necesario utilizar un sombreador de geometría, un VBO o cualquier memoria.

Un sombreador de vértices puede generar el quad.

layout(location = 0) out vec2 uv; void main() { float x = float(((uint(gl_VertexID) + 2u) / 3u)%2u); float y = float(((uint(gl_VertexID) + 1u) / 3u)%2u); gl_Position = vec4(-1.0f + x*2.0f, -1.0f+y*2.0f, 0.0f, 1.0f); uv = vec2(x, y); }

Enlaza un VAO vacío. Envía una llamada de sorteo para 6 vértices.


Para generar un shader de geometría cuádruple de pantalla completa se puede usar:

#version 330 core layout(points) in; layout(triangle_strip, max_vertices = 4) out; out vec2 texcoord; void main() { gl_Position = vec4( 1.0, 1.0, 0.5, 1.0 ); texcoord = vec2( 1.0, 1.0 ); EmitVertex(); gl_Position = vec4(-1.0, 1.0, 0.5, 1.0 ); texcoord = vec2( 0.0, 1.0 ); EmitVertex(); gl_Position = vec4( 1.0,-1.0, 0.5, 1.0 ); texcoord = vec2( 1.0, 0.0 ); EmitVertex(); gl_Position = vec4(-1.0,-1.0, 0.5, 1.0 ); texcoord = vec2( 0.0, 0.0 ); EmitVertex(); EndPrimitive(); }

Vertex shader está simplemente vacío:

#version 330 core void main() { }

Para usar este sombreador puedes usar el comando de extracción ficticia con VBO vacío:

glDrawArrays(GL_POINTS, 0, 1);


Puede enviar dos triángulos creando un quad, con sus atributos de vértice establecidos en -1/1 respectivamente.

No necesita multiplicarlos con ninguna matriz en el sombreador de vértices / fragmentos.

Aquí hay algunos ejemplos de código, simple como es :)

Vertex Shader:

const vec2 madd=vec2(0.5,0.5); attribute vec2 vertexIn; varying vec2 textureCoord; void main() { textureCoord = vertexIn.xy*madd+madd; // scale vertex attribute to [0-1] range gl_Position = vec4(vertexIn.xy,0.0,1.0); }

Fragmento Shader:

varying vec2 textureCoord; void main() { vec4 color1 = texture2D(t,textureCoord); gl_FragColor = color1; }