2013-01-16 4 views
0

Dans DirectX, je sais que je peux faire quelque chose comme ça.OpenGL Fragment Shader VS DirectX Fragment Shader

struct GBufferVertexOut 
{ 
    float4 position  : POSITION0; 
    float4 normal  : TEXCOORD0; 
    float2 texCoord  : TEXCOORD1; 
}; 

GBufferFragOut GBuffersFS(GBufferVertexOut inVert) 
{ 
    GBufferFragOut buffOut; 
    buffOut.normal = normalize(inVert.normal); 
    buffOut.normal = (buffOut.normal + 1) * .5; 
    buffOut.diffuse = tex2D(diffuseSampler, inVert.texCoord); 
    buffOut.diffuse.a = tex2D(ambientSampler, inVert.texCoord).r; 
    buffOut.specular = float4(1, 1, 1, 1); 

    return buffOut; 
} 

donc mon résultat fragment est une collection d'informations Je suis en train de convertir un shader openGL pour faire quelque chose de similaire

mais pouvez-vous même pas faire cela ?. Je n'ai jamais rien retourné auparavant, même si un fragment de fragment OpenGL en plus d'un vec4 pour "Fragment Color" et je n'arrive pas à trouver des informations qui me disent que je peux retourner plus.

Répondre

2

Dans opengl, vous définissez vos variables de sortie en dehors de la fonction principale, puis définissez leurs valeurs dans cette fonction. Ainsi, l'équivalent du code HLSL vous il y aurait quelque chose comme ça (fragment shader)

layout (location = 0) out vec4 diffuse;  //these are the outputs 
layout (location = 1) out vec4 normal; 
layout (location = 2) out vec4 specular; 

in vec4 in_position; //these are the inputs from the vertex shader 
in vec4 in_normal; 
in vec2 in_tex_coord; 

void main() 
{ 
    normal = normalize(in_normal); 
    normal = (normal + vec4(1.0, 1.0, 1.0, 1.0)) * 0.5; 
    diffuse = texture(diffuseSampler, in_tex_coord); 
    ambient = texture(ambientSampler, in_tex_coord); 
    specular = vec4(1.0, 1.0, 1.0, 1.0); 
} 

Ensuite, dans votre application, vous devez vous assurer que vous avez lié un framebufferobject qui a le nombre et le type de pièces jointes écrire à.

+0

Oh désolé. Oui, j'ai ces variables dans mon vertex shader. est-ce que vous dites que je devrais manipuler l'information là-bas? parce que j'essayais d'obtenir des données "normales" par pixel ou de suivre la position des pixels. –

+0

parce que je garde une trace de l'image. Je lie mon tampon de trame. et j'écris dessus. Mais dans directX votre fragment shader produit toutes les informations que vous lui dites de jeter. –

+0

désolé édité la réponse, n'a pas lu correctement la question – Slicedpan

Questions connexes