1

glTexGen の GLSL 置換を GL_OBJECT_LINEAR で実装するために数時間試みてきました。OpenGL ES 2.0 用。Ogl GLSL には、これを簡単にする gl_TextureMatrix がありますが、OpenGL ES 2.0 / OpenGL ES Shader Language 1.0 では利用できません。

いくつかのサイトでは、GLSL vert シェーダーでこれを行うのは「簡単」であると述べています。しかし、私はそれを機能させることができません。

私の直感では、飛行機を正しく設定していないか、私の理解に何かが欠けています。

私はウェブを熟読しました。しかし、ほとんどのサイトは投影されたテクスチャについて話しているので、平面投影に基づいて UV を作成しようとしているだけです。モデルは Maya で構築されており、50,000 個のポリゴンがあり、モデラーは平面マッピングを使用していますが、Maya は UV をエクスポートしません。だから私はこれを理解しようとしています。

glTexGen のマンページ情報を見てきました。

g = p1xo + p2yo + p3zo + p4wo

グとは?g は texture2d 呼び出しの s の値ですか?

私はサイトを見てきました:

http://www.opengl.org/wiki/Mathematics_of_glTexGen

別のサイズで同じ機能が説明されています。

座標 = P1*X + P2*Y + P3*Z + P4*W

coord (私の頭の中の UV vec2) が内積 (スカラー値) と等しいかどうかわかりませんか? 「g」で以前に発生したのと同じ問題。

飛行機を何に設定しますか?私のopengl c++ 3.0コードでは、[0、0、1、0](基本的にユニットz)に設定すると、glTexGenがうまく機能します。

私はまだ何かが欠けています。

私の頂点シェーダーは基本的に次のようになります: WVPMatrix = World View Project Matrix. POSITION はモデル頂点の位置です。

vec4 kOutBaseTCoord を変化させます。
ボイドメイン()
{
    gl_Position = WVPMatrix * vec4(位置、1.0);

    vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0);
    vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0);
    vec4 rPlane = vec4(0.0, 0.0, 0.0, 0.0);
    vec4 qPlane = vec4(0.0, 0.0, 0.0, 0.0);

    kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
    kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);
    //kOutBaseTCoord.r = dot(vec4(POSITION, 1.0), rPlane);
    //kOutBaseTCoord.q = dot(vec4(POSITION, 1.0), qPlane);

}

フラグ シェーダー

精度中位浮動小数点数。
均一サンプラー2D BaseSampler;
mediump vec4 kOutBaseTCoord を変化させます。
ボイドメイン()
{

    //gl_FragColor = vec4(kOutBaseTCoord.st, 0.0, 1.0);
    gl_FragColor = texture2D(BaseSampler, kOutBaseTCoord.st);
}

Fragシェーダーでtexture2DProjを試しました

ここに私が調べた他のリンクのいくつかがあります

http://www.gamedev.net/topic/407961-texgen-not-working-with-glsl-with-fixed-pipeline-is-ok/

前もって感謝します。

4

1 に答える 1

3

glTexGen ドキュメントから ::

void glTexGenfv ( GLenum coord , GLenum pname , const GLfloat *params );

  • coord - テクスチャ座標を指定します。GL_S、GL_T、GL_R、または GL_Q のいずれかでなければなりません。
  • pname - テクスチャ生成関数が GL_OBJECT_LINEAR の場合、関数

g = p1 xo + p2 yo + p3 zo + p4 wo

が使用されます。ここで、gはcoordで指定された座標に対して計算された値です...

したがって、gは実際にはスカラー値であり、 coord (GL_S または GL_T)の値に応じて、vec2 uv 値の sまたはtコンポーネントのいずれかになります。

より明確にするために、への呼び出し

glTexGen(GL_S, GL_OBJECT_LINEAR, {ps0,ps1,ps2,ps3})
glTexGen(GL_T, GL_OBJECT_LINEAR, {pt0,pt1,pt2,pt3})

と類似しています

vec4 sPlane = vec4(ps0,ps1,ps2,ps3);
vec4 tPlane = vec4(pt0,pt1,pt2,pt3);
kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);

POSITION 値のスケールによっては、出力st座標が (0,1) 範囲外になる場合があります。あなたの値を使用して:

vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0);
vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0);

モデル頂点のx座標をテクスチャ座標の s値に直接マッピングします。これはyおよびtと同じです。したがって、モデルの座標範囲が (0,1) の外にある場合、UV 値はそれに続きます。

テクスチャをモデルに適合させるには、投影のスケールをモデルのサイズに適合させる必要があります。モデル サイズが 100.0 の例では、次のコードが得られます。

float MODEL_SIZE = 100.0;
vec4 sPlane = vec4(1.0/MODEL_SIZE, 0.0, 0.0, 0.0);
vec4 tPlane = vec4(0.0, 1.0/MODEL_SIZE, 0.0, 0.0);

モデルが(0,0,0)の中心にある場合、このソリューションでも0未満の値が得られます。これを調整するには、結果の UV 値にオフセットを追加します。そのような :

kOutBaseTCoord.st += vec(0.5);

これらすべては、アプリケーションと、テクスチャ プロジェクションで何を達成しようとしているのかに大きく依存することに注意してください。必要に応じて数式を調整することを躊躇しないでください。それがシェーダーの目的です。

于 2011-02-21T07:40:21.857 に答える