4

プログラムのデバッグに問題があります。配列をルックアップテーブルとして使用して、頂点シェーダーの頂点の位置をオフセットしようとしていますが、配列を正しくリンクしているかどうかさえわかりません。オフセット係数は常にゼロになります(ベクトルに形状を与えるのではなく、ベクトルを平坦化します)。そのため、texture1D座標に間違ってアクセスしているか、配列がテクスチャに正しくバインドされていません。

率直に言って、1Dテクスチャから値を取得するためにどの座標を使用すべきかわかりません...しかし、すべての組み合わせを試しました。

ここで、配列をセットアップし、シェーダーにバインドします。

//FISH
GLfloat fish_coords[100];
for (int i = 0; i < 50; i++){fish_coords[i] = 0;}
for (int i = 50; i < 100; i++){fish_coords[i] = 1;}
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glGenTextures(1, &fishtexture);  
glBindTexture(GL_TEXTURE_1D, fishtexture);
glTexImage1D(GL_TEXTURE_1D, 0, 1, 128,0,GL_RGBA, GL_UNSIGNED_BYTE, &fish_coords);

switch(shadow_selection){
case 0: 
    vertexShader = "fish.vert";
    fragmentShader = "fish.frag";
    setShaders();

    GLint loc1;
    loc1 = glGetUniformLocation(shaderProgram,"fish_coords");
    glUniform1i(loc1,0);    

そして私の頂点シェーダー:

uniform float spec_factor;
uniform sampler1D fish_coords;

varying vec3 lightDir,normal;

void main()
{

    vec4 v_pos;
    vec3 ldir;

    gl_TexCoord[0] = gl_MultiTexCoord0;

    v_pos = gl_ModelViewMatrix * gl_Vertex;
    ldir = vec3(gl_LightSource[0].position-v_pos);
    lightDir = normalize(ldir);
    normal = normalize(gl_NormalMatrix * gl_Normal);

    vec4 offset;
    offset = texture1D(fish_coords, gl_TexCoord[0].r);

    vec4 fish_shape;
    fish_shape.xz = gl_Vertex.xz;
    fish_shape.y = gl_Vertex.y * offset.x;
    fish_shape.w = 1;

    gl_Position = gl_ModelViewProjectionMatrix * fish_shape;
}
4

2 に答える 2

3

テクスチャ読み込みコードには2つの問題があります。

1.-デフォルトのMINフィルターはミップマップを使用するため、そのセットアップではテクスチャが不完全になります。テクスチャをGL_NEARESTにバインドした後、MIN/MAGフィルターを設定します。2.-テクスチャデータはfloatですが、GLに署名されていないバイトであると言い、それをGL_FLOATに変更します。

この変更後、テクスチャが表示されます。

于 2010-11-05T13:03:52.457 に答える
1

テクスチャフィルタリングなしでテクスチャの単一のテクセルにアクセスできるGLSLコマンドがあります。texelFetch正規化された座標(0-1)を使用する代わりに整数を使用するため、texelFetch(32、32)はテクセル32をフェッチします。右にテクセル、下に32テクセル。

あなたはかなり古い学校のGLSLを書いているようですが、それがどれほど適切かはわかりません。

警告:GLSLプログラムをNvidiaカードでNvidiaドライバーを使用してコンパイルしている場合は、CGのようにコンパイルされますが、これには面白い注意点があります。興味深いことに、インデックスにハードコードされた値を使用して、十分に大きな配列のインデックスにアクセスしようとすると(テクスチャを配列として使用しているため、問題にはなりません)、コンパイルされます。ただし、動的インデックス(変数)を使用して同じ配列のフィールドにアクセスすると、コンパイルされません。その理由は、Nvidiasコンパイラが使用されていないすべてのインデックスを最適化するためです(ハードコードされた値を使用しているため、コンパイラは他の配列値を破棄できると考えます)。

これは私に数年前にかなりの頭痛を与えました。

ちなみに、あなたは魚の群れか何かをレンダリングしようとしているようですが、デモがある場所はどこですか?

于 2012-10-24T08:56:01.853 に答える