2

ubuntu 13.04で実行されているIntel HDグラフィックス2000/3000グラフィックスカードで、opengl 3.1の下でテクスチャリングを機能させようとしています。私が直面している問題は、テクスチャが読み込まれず、テクスチャを作成しようとしている基本的な三角形が黒く表示されるか、テクスチャの一部の色が読み込まれますが、画像全体ではありません。生の画像ファイルをソースとして使用するか、libjpeg で jpeg をロードしても同じ結果が得られます。

私のシェーダーは次のとおりです。

頂点シェーダー

#version 130

in vec3 vert;
in vec2 vertTextCoord;

out vec2 fragTexCoord;

void main(){
    fragTexCoord = vertTextCoord;
    gl_Position = vec4(vert,1);

}

フラグメントシェーダー

#version 130

uniform sampler2D tex;

in vec2 fragTexCoord;

out vec4 finalColor;

void main() {

    finalColor = texture(tex, fragTexCoord);
}

テクスチャを作成するコード glGenTextures( 1, &texture); glBindTexture( GL_TEXTURE_2D, テクスチャ);

imgdata image_data = loadRaw("texture.bmp", 256, 256);

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_CLAMP_TO_EDGE);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE,image_data.data);

そしてレンダリング機能

void display(void){
glClearColor( 1.f, 0.f, 0.f, 0.f);
glClear(GL_COLOR_BUFFER_BIT );

//load program to use
glUseProgram(shaderprogram);

GLint uniform = glGetUniformLocation(shaderprogram, "tex");
if(uniform == -1){
    throw std::runtime_error(std::string("program uniform not found: tex"));
}

// bind the texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(uniform, 0);

//load vertex array to use
glBindVertexArray(cubeVAO);

//draw triangle
glDrawArrays(GL_TRIANGLES, 0, 3);

//unbind for next pass
glBindVertexArray(0);
glUseProgram(0);

glfwSwapBuffers();
}

ジオメトリとテクスチャ座標

GLfloat data[] = {
//X   Y    Z     U    V
0.0f, 0.8f, 0.0f,      0.5f, 1.0f,
-0.8f, -0.8f, 0.0f,    0.0f, 0.0f,
0.8f, -0.8f, 0.0f,     1.0f, 0.0f
};

VBO と VAO のセットアップ中

glGenVertexArrays(1, &cubeVAO);
glBindVertexArray(cubeVAO);
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);


glEnableVertexAttribArray(vertprog);
glVertexAttribPointer(vertprog, 3, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), NULL);

glEnableVertexAttribArray(verttexprog);
glVertexAttribPointer(verttexprog, 2, GL_FLOAT, GL_TRUE, 5*sizeof(GLfloat), (const GLvoid*)(3*sizeof(GLfloat)));

glBindVertexArray(0);
4

1 に答える 1

0

の値を決定するコードを示していませんverttexprogverttexprogあなたが現在持っているコードから、 (ちなみに、これはひどい変数名です) が初期化されていないと仮定する必要があります。

プログラムをリンクverttexprogした後、に初期化する必要があります。glGetAttribLocation (program, "vertTextCoord");同様に、フレームごとに均一な場所を照会しないでください。変更されるのは、GLSL プログラムを (再) リンクした後だけです。


テクスチャは正しく読み込まれていますが、テクスチャ座標は正しくありません。これを実際に見たい場合は、次のように置き換えることができます。

finalColor = texture(tex, fragTexCoord);

と:

finalColor = texture(tex, gl_FragCoord.st);

これは望んでいる動作ではありませんが、テクスチャが正常に読み込まれたことを示す優れた方法です。

于 2013-11-14T23:47:07.353 に答える