0

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シェーダーを変換して同様のことを実行しようとしている情報のコレクションです。

しかし、あなたもそれをすることができますか?「FragmentColor」用のvec4以外のopenGLフラグメントシェーダーを使用したことがありますが、これまでに何も返さなかったため、さらに返すことができるという情報が見つからないようです。

4

1 に答える 1

2

opengl では、出力変数を main 関数の外で定義し、その値をその関数内で設定します。したがって、あなたが持っている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);
}

次に、アプリケーションで、書き込み先のアタッチメントの数とタイプが正しいフレーム バッファ オブジェクトがバインドされていることを確認する必要があります。

于 2013-01-16T18:17:08.483 に答える