2011-12-26 5 views
20

Che aspetto hanno gli ombreggiatori GLSL di vertice, frammento e geometria di default per la versione # 330?Come sono gli shader GLSL predefiniti? per la versione 330

Userò #version 330 GLSL versione 3.30 NVIDIA tramite compilatore Cg, perché è quello che supporta la mia scheda grafica.

Con gli shader di default, intendo shader che fanno esattamente la stessa cosa che farebbe la scheda grafica quando il programma shader è disattivato.

Non riesco a trovare un buon esempio per #version 330. Stato googling tutto il giorno. Non sono sicuro se il termine shader predefinito è chiamato qualcos'altro come banale o di base e se è per questo motivo non riesco a trovarlo.

Qualsiasi suggerimento per un libro con la versione 330 o collegamento a un facile tutorial per principianti con la versione 330 sarebbe ottimo.

esempio di vertex banale #version 110, fa la trasformazione predefinita vertice

#version 110 

void main() 
{ 
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; 
} 

esempio di uno shader frammento banale #version 110, si trasforma in colore rosso

#version 110 

void main() 
{ 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 
+0

Nel senso più tecnico, non è possibile disattivare lo shader nel nucleo GL 3.3, poiché la capacità di eseguire il rendering senza shader è stata rimossa in [contesti OpenGL core] (http://www.opengl.org/wiki/Core_And_Compatibility_in_Contexts) . Il Wiki di OpenGL mantiene un [elenco di esercitazioni basate su shader] (http://www.opengl.org/wiki/Getting_started#Tutorials_and_How_To_Guides) (uno dei quali è mio), ma nessuno di essi ha shader che si mappano direttamente su cosa fisso -funzionalità farebbe Questo è probabilmente il * peggiore * modo di apprendere comunque la programmazione basata sullo shader. –

risposta

31

Ci non ci sono shader "predefiniti" con OpenGL. Sembra che ciò che si vuole un esempio molto semplice di uno shader che trasforma i vertici per ritagliare lo spazio e dà loro un colore, in modo da qui si va:

Vertex Shader:

#version 330 

layout(location = 0)in vec4 vert; 

uniform mat4 projection; 
uniform mat4 view; 
uniform mat4 model; 

void main() 
{ 
    gl_Position = projection * view * model * vert; 
} 

Fragment Shader:

#version 330 

out vec4 fragColor; 

void main() 
{ 
    fragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 

Il core del profilo OpenGL 3.3 elimina il supporto per molte vecchie cose a funzionalità fissa come lo stack matrix. Dovresti gestire le tue matrici e inviarle ai tuoi shader. Non c'è ftransform e gl_Position è praticamente l'unica variabile gl_ * valida.

Mentre glBindAttribLocation non è deprecato, il metodo preferito per definire la posizione degli attributi di vertice è tramite "layout (location = x)" in GLSL.

Nel vertex shader, "attribute" è ora "in" e "varying" è ora "out". Nello shader di frammenti, "varying" è ora "in" e "gl_FragColor" è definito da una variabile "out". Credo che gl_FragColor sia ancora valido, ma ora è possibile utilizzare una variabile out per definire il colore.

This tutorial è molto buono e insegna core OpenGL e GLSL 3.30, ti consiglio di utilizzarlo per aiutarti a saperne di più su GLSL. Ricorda inoltre che lo GLSL Reference Pages è tuo amico.

+4

grazie ho anche guardato nel libro "OpenGL 4.0 Shading Language Cookbook "e c'era un esempio di triangolo di colore simile che chiariva tutto per me: ero così confuso che tutte le cose basilari/banali erano deprecate, mi sentivo come se qualcuno mi avesse strappato le impronte sotto di me. – ColacX