0

3D シーンの上に 2D 画像を表示しようとしましたが、まったく結果がありませんでした (3D シーンの上に何も表示されないため)。通常の gdb デバッグを試み、APITraceを使用して、すべての OpenGL 呼び出しが正しく機能していることを確認しました。画像が表示されない理由がわかりません。さらにいくつかのテストを行った結果、問題はテクスチャ自体ではなく、テクスチャが存在する 2 つの三角形のレンダリングにあると考えています。以下は、関連するすべてのコードです。

// Constants
const int COORD_LOCATION = 10;
const int UV_LOCATION = 5;

// Program Loading
uint program = loadShaders("2d.fs","2d.vs") // Same function used for loading shaders for 3D objects, so the function itself should work

// Texture creation
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, temp_width, temp_height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_data); // image_data is generated by libpng earlier, and it is valid according to apitrace
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

/* Later, when texture rendering is started... */
uint UV_BUFFER, cb;

glGenBuffers(1, &UV_BUFFER);
glGenBuffers(1, &cb);

const float data[] = { 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f };

glBindBuffer(GL_ARRAY_BUFFER, UV_BUFFER);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), &data[0], GL_STATIC_DRAW);

vec2 f1 = vec2(-0.5f, -0.5f);
vec2 f2 = vec2(0.5f, 0.5f);

// Set the 2d coordinates for the shader
const float data2[] = { f1.x, f1.y, 
                    f1.x, f2.y, 
                    f2.x, f1.y, 
                    f2.x, f1.y, 
                    f1.x, f2.y, 
                    f2.x, f2.y };
// Load into buffer
glBindBuffer(GL_ARRAY_BUFFER, cb);
glBufferData(GL_ARRAY_BUFFER, sizeof(data2), &data2[0], GL_STATIC_DRAW);

// During rendering...
glUseProgram(program);
glEnableVertexAttribArray(COORD_LOCATION);
glBindBuffer(GL_ARRAY_BUFFER, cb);
glVertexAttribPointer(
    COORD_LOCATION,                  // attribute. No particular reason for 0, but must match the layout in the shader.
    2,                  // size
    GL_FLOAT,           // type
    GL_FALSE,           // normalized?
    0,                  // stride
    (void*)0            // array buffer offset
);

// Send uniform texture
uint tex = glGetUniformLocation(program, TEXTURE_UNIFORM);
// Bind our texture in Texture Unit 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
// Set our "myTextureSampler" sampler to user Texture Unit 0
glUniform1i(tex, 0);

// Send UVs to the location
glEnableVertexAttribArray(UV_LOCATION);
glBindBuffer(GL_ARRAY_BUFFER, UV_BUFFER);
glVertexAttribPointer(
    UV_LOCATION,        // attribute. No particular reason for 0, but must match the layout in the shader.
    2,                  // size
    GL_FLOAT,           // type
    GL_FALSE,           // normalized?
    0,                  // stride
    (void*)0            // array buffer offset
);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glDrawArrays(GL_TRIANGLES, 0, 6);

glDisable(GL_BLEND);

glDisableVertexAttribArray(COORD_LOCATION);
glDisableVertexAttribArray(UV_LOCATION);

2D 頂点シェーダー:

#version 330 core

layout(location = 10) in vec2 coords;
layout(location = 5) in vec2 inUV;

out vec2 UV;

void main(){
gl_Position.x = coords.x;
gl_Position.y = coords.y;
gl_Position.z = 0;
gl_Position.w = 1;
UV = inUV;
}

2D フラグメント シェーダー:

#version 330 core

in vec2 UV;

uniform sampler2D tex;

out vec3 color;

void main(){
    color = texture(tex, UV);
}

コードは実際にはこれよりもかなり散らばっていますが、これが私が確認した結果です。VCSの完全なコードを参照してください(これは私の友人であり、OpenGL を練習するために開発することにしたランダムなゲームであり、まだ正式な名前はありません)。

4

1 に答える 1

0
vec2 f1 = vec2(-0.5f, -0.5f);
vec2 f2 = vec2(-0.5f, -0.5f);

それらは同じ点のように見えます。通常、ゼロ (スクリーンスペース) 領域の三角形はラスタライズされません。

これに変更f2してみてください:

vec2 f2 = vec2(0.5f,  0.5f);

glDrawArrays(GL_TRIANGLES, 0, 10000);
                              ^^^^^

に変更してみて10000ください6。VBO には頂点が 6 つしかないためです。

于 2013-06-28T19:17:48.613 に答える