2013-01-16 272 views
0

在DirectX中,我知道我可以做這樣的事情。OpenGL片段着色器VS DirectX片段着色器

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; 
} 

所以我的片段結果的信息 我想轉換一個OpenGL着色器做類似的

東西的集合,但你能甚至做到這一點?我從來沒有返回任何其他的東西,雖然除了vec4的「片段顏色」openGL片段着色器,我似乎無法找到任何信息,告訴我我可以返回更多。

回答

2

在opengl中,您可以在主函數之外定義輸出變量,然後在該函數中設置它們的值。所以,你必須將HLSL代碼相當於會有這樣的事情(片段着色器)

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); 
} 

然後在你的應用程序,你需要確保你已經綁定其帶有附件的正確數量和類型f​​ramebufferobject寫信給。

+0

對不起。是的,我的頂點着色器中有這些變量。你是在說我應該操縱那裏的信息嗎?因爲我試圖獲得每個像素「正常」的數據或跟蹤像素位置。 –

+0

,因爲我正在跟蹤圖像。我確實綁定了我的幀緩衝區。我寫信給它。但在directX中,你的片段着色器會輸出你告訴它丟棄的所有信息。 –

+0

對不起,編輯答案,沒有正確地讀取問題 – Slicedpan