1

古いゲーム形式の読み込みをサポートするクライアントを作成しています。すべての頂点に頂点カラーが提供されることが多い偽の照明を使用します。以下を使用して、照明が正しく表示されるようにしました。

vec4 textureColor = texture2D(texture, outtexture) * vertexColor;

問題は、提供された頂点が RGB で 0.0、0.0、0.0 の場合、テクスチャ全体がもちろん黒くなることでした。いくつかの異なるアルゴリズムを試してみましたが、テクスチャがまだ少し暗いか、ライトが明るすぎます。

シェーダーは次のとおりです。

float ambient = 1.0;

vec4 textureColor = texture2D(texture, outtexture);
vec4 lighting = vec4((vertexColor * vertexColor.a) + (ambient * textureColor));

gl_FragColor = textureColor * lighting;

次に例を示します。

光のないテクスチャは暗すぎる

ここで、頂点カラー データも少し奇妙です。次に例を示します。

<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.000000
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.000000
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.000000
<-!-> R: 0.023529, G: 0.023529, B: 0.003922, A: 0.858824
<-!-> R: 0.007843, G: 0.007843, B: 0.000000, A: 0.850980
<-!-> R: 0.007843, G: 0.007843, B: 0.000000, A: 0.858824
<-!-> R: 0.023529, G: 0.023529, B: 0.003922, A: 0.858824
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.882353
<-!-> R: 0.078431, G: 0.078431, B: 0.015686, A: 0.858824
<-!-> R: 0.078431, G: 0.078431, B: 0.015686, A: 0.858824
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.894118
<-!-> R: 0.031373, G: 0.031373, B: 0.007843, A: 0.862745
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.882353
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.894118
<-!-> R: 0.031373, G: 0.031373, B: 0.007843, A: 0.858824
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.858824
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.835294

いくつかの通常の値 (0, 0, 0, 0) と、10 進数を含むいくつかの通常の値、および 0, 0, 0 であり、アルファが定義されている値が含まれていることに注意してください。

この方法を見たことがある場合、または通常の外観のレンダリングを実現する方法について提案がある場合は、お気軽に声をかけてください。はい、この質問は少し違うと思いますが、誰かが洞察を持っていることを願っています.

編集:これがまったく役立つ場合、私の友人は同様のプロジェクトを持っていました. これは、彼が情報を読み込んで DirectX 用にパッケージ化した方法です。

     int iBlue  = GetByte( );
     int iGreen = GetByte( );
     int iRed   = GetByte( );
     int iAmb   = GetByte( );

     pVertex->m_dwDiffuse = D3DCOLOR_ARGB( (BYTE)( max( iAmb,     1 ) ), 
                                           (BYTE)( max( iRed,     1 ) ), 
                                           (BYTE)( max( iGreen,   1 ) ),
                                           (BYTE)( max( iBlue,    1 ) ) );

私は、彼が私とまったく同じことを行い、バイトを整数に変換し、それらが負の場合は、それらを 1 に置き換えると仮定しています。

それはどのように見えるはずですか:

日中(ほとんど/ほとんど光が見えない) ここに画像の説明を入力

夜:

ここに画像の説明を入力

私のもの(上記のシェーダーコードを使用): ここに画像の説明を入力

ライトが明るすぎるか、テクスチャへの黒の影響で見づらくなっているようです。

4

0 に答える 0