ベクトルタイプに格納されている頂点とテクスチャの座標で要素インデックスを使用しようとしています。
私の問題は、テクスチャが長方形に正しくレンダリングされていないことです。
関連するシェーダーの初期化は次のとおりです。
prog = f.compile_shaders(vshader, fshader);
const char* uniform_name = "mvp";
this->uni_mvp = glGetUniformLocation(prog, uniform_name);
if (this->uni_mvp == -1) {
fprintf(stderr, "Could not bind uniform %s\n", uniform_name);
return;
}
uniform_name = "texData";
this->uni_texdata = glGetUniformLocation(prog, uniform_name);
if (this->uni_texdata == -1) {
fprintf(stderr, "Could not bind uniform %s\n", uniform_name);
return;
}
そして頂点シェーダー:
layout(location = 0) in vec4 coord3d;
layout(location = 1) in vec2 texcoord;
uniform mat4 mvp;
out vec2 uv;
void main(void) {
gl_Position = mvp * coord3d;
uv = texcoord;
}
そしてフラグメントシェーダー:
in vec2 uv;
out vec3 color;
uniform sampler2D texData;
void main(){
color = texture2D(texData, uv).rgb;
}
関連するBUFFER初期化コードは次のとおりです。
glGenVertexArrays(1, &this->vao);
glBindVertexArray(this->vao);
glm::vec2 bar;
bar.x = 0.0; bar.y = 0.0;
texcoords.push_back(bar);
bar.x = 1.0; bar.y = 0.0;
texcoords.push_back(bar);
bar.x = 1.0; bar.y = 1.0;
texcoords.push_back(bar);
bar.x = 0.0; bar.y = 1.0;
texcoords.push_back(bar);
glm::vec4 foo;
foo.x = 0.0; foo.y = 0.0; foo.z = 0; foo.w = 1.0;
vertices.push_back(foo);
foo.x = 10.0; foo.y = 0.0; foo.z = 0; foo.w = 1.0;
vertices.push_back(foo);
foo.x = 10.0; foo.y = 10.0; foo.z = 0; foo.w = 1.0;
vertices.push_back(foo);
foo.x = 0.0; foo.y = 10.0; foo.z = 0; foo.w = 1.0;
vertices.push_back(foo);
elements.push_back(0);
elements.push_back(1);
elements.push_back(2);
elements.push_back(3);
glGenBuffers(1, &this->tbo);
glBindBuffer(GL_ARRAY_BUFFER, this->tbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords) * sizeof(texcoords[0]), texcoords.data(), GL_STATIC_DRAW);
glGenBuffers(1, &this->vbo);
glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), vertices.data(), GL_STATIC_DRAW);
glGenBuffers(1, &this->ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, elements.size() * sizeof(elements[0]), elements.data(), GL_STATIC_DRAW);
関連するTEXTURE初期化コードは次のとおりです。
glGenTextures(1, &this->texture_id);
glBindTexture(GL_TEXTURE_2D, this->texture_id);
int k = 12;
GLubyte image[12][12][3];
for ( int i = 0; i < k; i++ ) {
for ( int j = 0; j < k; j++ ) {
GLubyte c = (((i & 0x8) == 0) ^ ((j & 0x8) == 0)) * 255;
image[i][j][0] = c;
image[i][j][1] = c;
image[i][j][2] = c;
}
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, k, k, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
関連するレンダリング/表示コードは次のとおりです。
glUseProgram(this->prog);
glBindVertexArray(this->vao);
glUniformMatrix4fv(this->uni_mvp, 1, GL_FALSE, glm::value_ptr(f.mvp));
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, this->texture_id);
glUniform1i(this->uni_texdata, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, this->tbo);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->ibo);
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
glDrawElements(GL_QUADS, size / sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindVertexArray(0);
このコードは、テクスチャを使用して長方形をレンダリングしますが、テクスチャが間違っています(長方形に正しく表示されないだけです)。私の知る限り、テクスチャリング座標はこの単純な例に対して正しいはずです。インデックス作成とテクスチャに問題がありますか?これを行う方法の頂点座標ですか?
これが私の緑の背景のレンダリングの写真です:
長方形の白黒チェッカーボード(12パーツ)を期待しています。
最後のテクスチャ座標を追加すると、レンダリングは次のようになります。
UDPATE:たとえば、チェッカーボードテクスチャを大きく作成するGLubyte image[16][16][3];
と、次のレンダリングが得られます。
また、.rawファイルが正しくレンダリングされることにも気づきました。それでも、チェッカーボードのテクスチャに16 x 16の正方形が表示されることを期待していますか?