0

画面に描いた四角形に重ねるシンプルなテクスチャをアップロードしたいです。テクスチャのないコードでは、画面中央に赤い四角が表示されます。このコードを編集してテクスチャを上に重ねますが、テクスチャを正方形に適用しようとするたびに、画像が歪んで画面上を移動します。編集: ここで利用可能なコード全体: http://codetidy.com/6291/

テクスチャ適用前:ここに画像の説明を入力

テクスチャ適用後:ここに画像の説明を入力

サンプルコード:

void init()


// Create an OpenGL 2D texture from the BOX resource.
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_SRC_COLOR); 
    glGenTextures(1, &TextureHandle);
    glBindTexture(GL_TEXTURE_2D, TextureHandle);

    // Set texture parameters.
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    maOpenGLTexImage2D(TEXTURE);

編集: draw() 関数全体

void draw()
    GLfloat vVertices[] = { -1.0f, 1.0f, 0.0f,
                       -1.0f, -1.0f, 0.0f,
                       1.0f, 1.0f, 0.0f,
                       1.0f, -1.0f, 0.0f
                                    };


            GLfloat TexCoord[] = {0.0, 1.0,
                    0.0, 0.0,
                    1.0, 1.0,
                    1.0, 0.0};

            // Set the viewport
            glViewport(0, 0, mWidth, mHeight);

            // Clear the color buffer
            glClear(GL_COLOR_BUFFER_BIT);

            // Use the program object
            glUseProgram(mShader);
            checkGLError("glUseProgram");

            glBindTexture(GL_TEXTURE_2D, TextureHandle);

            // Set uniform function
            glUniformMatrix4fv(mMvpLoc, 1, false, MyMatrix);
            checkGLError("glUniform4fv");

            //glActiveTexture(GL_TEXTURE0);
            glUniform1i(mTextureLoc, 0);

            // Load the vertex data, i.e attributes and quads
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
            glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, TexCoord);
            checkGLError("glVertexAttribPointer");

            glEnableVertexAttribArray(0);
            glEnableVertexAttribArray(1);
            checkGLError("glEnableVertexAttribArray");

            glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
            checkGLError("glDrawArrays");

頂点およびフラグメント シェーダー:

char vertexShaderSource[] =
        "attribute vec4 vPosition;   \n"
        "uniform mat4 uMvp;          \n"
        "attribute vec2 TexCoordIn;  \n"
        "varying vec2 TexCoordOut;   \n"

        "void main()                 \n"
        "{                           \n"

        "gl_Position = uMvp * vPosition; \n"
        "TexCoordOut = TexCoordIn.xy;       \n"
            "}                           \n";

        char fragmentShaderSource[] =
        "precision highp float;\n"
        "varying vec2 TexCoordOut;\n"
        "uniform sampler2D Texture;\n"

        "void main()\n"
        "{\n"

        "gl_FragColor = texture2D(Texture, TexCoordOut);\n"

        "}\n";
4

3 に答える 3

1

おそらく、頂点とテクスチャの属性が入れ替わっていませんか?

私はこの部分について少し疑わしいです:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, TexCoord);

texcoord 属性が実際に位置 1 にあると確信していますか?

glGetAttribLocationを使用してこれらの場所を照会することをお勧めします。

于 2013-07-25T23:03:35.203 に答える
0

なんてばかげた間違いを犯すのでしょう!コードを整理しようとしていて、プログラムがリンクされる前に glBindAttributeLocation() コマンドを移動しました。これは、インデックスの 0 と 1 にあると思っていたので、頂点座標とテクスチャ座標の両方が読み込まれていないことを意味していました。したがって、それらを呼び出すコマンドが無効になりました。@cs の助けに感謝します。問題は完全には解決されませんでしたが (したがって、新しい回答が得られました)、正しい方向に進みました。

于 2013-07-29T09:37:18.807 に答える
0

テクスチャ座標はやや奇妙ですが、2 番目の頂点 (長方形の左下) に [1, 1] (テクスチャの右上) の座標を指定しますが、それ以外は上記のコードに問題はありません。

次に疑わしいのはMyMatrixと の値です。余計な訳がありそうです。おそらく、それを中央に配置するコードがいくつかあり、それは失敗しますか?

Edit1:長方形の辺は 2 単位です。つまり、画面の中心からすべての方向に 1 単位拡張されます。射影行列とモデル ビュー行列に単位行列を使用する場合、このような四角形は画面全体を正確にカバーします。マトリックスを ID に設定して確認してください。残された唯一の 2 つの容疑者は、正投影が正しくないか、ビューポートが画面全体をカバーしていないかのいずれかです。他に思いつかない

Edit2:コメントのリンクでソース全体を公開した後、ローカルで実行しようとしました (JOGL を使用しましたが、OpenGL の部分は同じである必要があります)。私が見つけた間違いの 1 つ (私のシステムでは機能していましたが、あなたのシステムでは失敗している可能性があります) は次の行です。

glBindAttribLocation(programObject, 1, "textureCoordinate");

その変数は として宣言されていvaryingます。あなたの属性名はinputTextureCoordinateです。それ以外は、コードは私のマシンで正常に実行されます (環境が異なるため、テクスチャとシェーダーをロードし、すべてのdouble値をに変換するために別のコードを使用する必要がありましたfloat)。したがって、上記の修正で問題が解決しない場合は、機能を無効にしてみてください。つまり、シェーダーでマトリックスを乗算せず、テクスチャをロード/バインドしないでください (glColor()代わりに使用してください)。単純な赤いクワッドが再び残るまで、コメントアウトします。削除されたステートメントの 1 つは、失敗したステートメントでなければなりません。

于 2013-07-25T15:03:17.733 に答える