1

AMD OpenGL ES SDK for 3.1 (2016 年 5 月 13 日現在)のフラグメント シェーダーは次のとおりです。

precision highp float;
uniform vec4 lightVec;
uniform sampler2D textureUnit0;
varying vec2 vTexCoord;
varying vec3 vNormal;
void main()
{
    vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1);
    gl_FragColor =  diff * texture(textureUnit0, vTexCoord);
}

これは完全に間違っています。私がそれを修正するのに最も近いのは次のとおりです。

precision highp float;
uniform vec4 lightVec;
uniform sampler2D textureUnit0;
varying vec2 vTexCoord;
varying vec3 vNormal;
void main()
{
    vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1);
    gl_FragColor =  diff * texture2D(textureUnit0, vTexCoord);
}

これは、最後の行でテクスチャを texture2D に変換するだけです。

拡散シェーダを計算しようとして何が起こっているのかわかりません。ドットを使用してフロートを取得し、フロートでスウィズル (それを.xxx演算子と呼んでいるものだと思います) を呼び出して、それを複製しようとしていますか?

シェーダーについて簡単に学ぶにはどうすればよいですか? 熟練するのは非常に難しい分野のようです。

4

2 に答える 2

0

関数を使用してtexture()テクスチャをサンプリングすることは、実際には ES 3.1 シェーダーでは正しいことです。このtexture2D()関数は、ES 2.0 に対応する GLSL バージョンで使用されていましたが、現在のバージョンでは使用されていません。

変更しなければならなかった理由は、シェーダー コードにバージョン ディレクティブがないためです。実際にシェーダー コードで ES 3.1 機能を使用する場合は、最初の行として次のように記述します。

#version 310 es

ただし、シェーダーは無効です。.xxxシェーダー コードでの の正式な名前は、コンポーネント選択演算子です。GLSL ES 3.10仕様で明確に説明されているベクトルにのみ適用されます。

スカラーは単一コンポーネントのベクトルとは見なされないため、スカラーでのコンポーネント選択演算子の使用は違法であることに注意してください。

このdot()関数は、スカラー値である float を返します。したがって、この構成は無効です。

dot(...).xxx

その行を正しく書き換える最もエレガントな(IMHO)方法は次のとおりです。

vec4 diff = vec4(vec3(dot(lightVec.xyz, normalize(vNormal))), 1.0);
于 2016-05-14T02:45:37.450 に答える