OpenGL ポリゴンにテクスチャを貼り付けたいが上手く行かない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
syoshinsya
記事: 2
登録日時: 3年前

OpenGL ポリゴンにテクスチャを貼り付けたいが上手く行かない

#1

投稿記事 by syoshinsya » 3年前

OpenGLなのですがポリゴンにテクスチャを貼り付けたいのですがなぜ上手くいかないのでしょうか?ちゃんと画像を読み込んで IDを取得して OpneGLとバインドしてると思うのですが。
提示コードは一番重要と思われる部分であり一部のコードです全文はGithubにあります。



Github : https://github.com/Shigurechan/DrawShader_test




//初期化
bool Game::Initialization()
{
//初期化 関係
//------------------------------------------------------------------------------------------------------------------------------------------------
//glfwの初期化に失敗
if (glfwInit() != GL_TRUE)
{
printf("glfwInit()失敗\n");
int _c = getchar();

return 0;
}

//コンテキストを作成
Window = glfwCreateWindow(640, 400, "Hello", NULL, NULL);

//OpenGLコンテキストの作成に失敗
if (Window == NULL)
{
printf("glfCreateWindow()失敗\n");
int c = getchar();

return 0;
}

//コンテキストをOpenGLの描画対象にする。
glfwMakeContextCurrent(Window);

//glewを初期化する。
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
printf("glewInit() の初期化に失敗しました。");
return 0;
}

//OpenGLバージョン指定
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 0);

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

//垂直同期のタイミングを待つ
glfwSwapInterval(1);

//ワールド行列を生成
//------------------------------------------------------------------------------------------------------------------------------------------------

if (LoadShader("Basic.vert","Basic.frag") == true)//シェーダーを読み込む
{
//printf("シェーダーを読み込む\n");
}

//シェーダーでの画面描画配列を設定
CreateWorldMatrix();
Set_move(0, 0, 0);
Set_rotate(0, 0, 0, 0);
Set_scale(1, 1, 1);




//テクスチャを設定


glGenTextures(1, &Texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

int width, height, nrChannels;

//画像読み込み
unsigned char* data = stbi_load("sample.png",&width,&height,&nrChannels,0);
if (data != nullptr)
{
printf("あああああ\n");
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}

static const GLfloat texuv[] = {
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
};
glTexCoordPointer(2, GL_FLOAT, 0, texuv);
glBindTexture(GL_TEXTURE_2D, Texture);
glActiveTexture(GL_TEXTURE0);
glDeleteTextures(1, &Texture);


//頂点バッファを設定
glGenVertexArrays(1, &vbo);
glBindVertexArray(vbo);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 4 * 8 * sizeof(float), Vertex, GL_STATIC_DRAW);
//glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE,0, 0);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);


//インデックスバッファを設定
glGenVertexArrays(1, &vao);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 6, index, GL_STATIC_DRAW);







mIsRunLoop = true;
return mIsRunLoop;
}


void Game::CreateWorldMatrix()
{

float r1[16];
mat4_mul(move, rotate, r1);
mat4_mul(r1, scale, wordlMatrix);

}

//アップデート
void Game::Update()
{
if (glfwGetKey(Window, GLFW_KEY_ESCAPE) == GLFW_PRESS || glfwWindowShouldClose(Window) != GL_FALSE)
{
mIsRunLoop = false;
}

//左右上下移動
if (glfwGetKey(Window, GLFW_KEY_LEFT) == GLFW_PRESS)
{
pos.x -= 0.03f;
pos.y += 0.0f;
pos.z += 0.0f;

Set_move(pos.x, pos.y, pos.z);
// mat4_mul(move,viewPro,viewPro);
printf("LEFT\n");
}
else if (glfwGetKey(Window, GLFW_KEY_RIGHT) == GLFW_PRESS)
{

pos.x += 0.03f;
pos.y -= 0.0f;
pos.z -= 0.0f;

Set_move(pos.x, pos.y, pos.z);

printf("RIGHT\n");
}
else if (glfwGetKey(Window, GLFW_KEY_UP) == GLFW_PRESS)
{

pos.x -= 0.0f;
pos.y += 0.03f;
pos.z -= 0.0f;

Set_move(pos.x, pos.y, pos.z);

printf("UP\n");

}
else if (glfwGetKey(Window, GLFW_KEY_DOWN) == GLFW_PRESS)
{

pos.x -= 0.0f;
pos.y -= 0.03f;
pos.z -= 0.0f;


Set_move(pos.x, pos.y, pos.z);

printf("DOWN\n");
}



//Z軸移動
if (glfwGetKey(Window, GLFW_KEY_Z) == GLFW_PRESS)
{

pos.x -= 0.0f;
pos.y -= 0.0f;
pos.z -= 0.03f;


Set_move(pos.x, pos.y, pos.z);
// Set_rotate(pos.x, pos.y, pos.z,(3.14f / 180.0f));

printf("Z: %.2f\n",pos.z);

}
else if (glfwGetKey(Window, GLFW_KEY_X) == GLFW_PRESS)
{

pos.x += 0.0f;
pos.y += 0.0f;
pos.z += 0.03f;

Set_move(pos.x, pos.y, pos.z);
//Set_rotate(pos.x, pos.y, pos.z, (3.14f / 180.0f));

printf("X: %.2f\n", pos.z);



}
}



//描画アップデート
void Game::GenerateOutput()
{
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(ShaderProgram);

CreateWorldMatrix();
create_matri_mp(1.0f, -1.0f, -1.0f, 1.0f, 0.1f, 9999999.0f);

glUniformMatrix4fv(glGetUniformLocation(ShaderProgram, "world"), 1, GL_FALSE, wordlMatrix);
glUniformMatrix4fv(glGetUniformLocation(ShaderProgram, "MP"), 1, GL_FALSE, viewPro);

glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
// glDrawArrays(GL_TRIANGLES,0,6);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT,0);


glViewport(0, 0, WIDTH, HEIGHT);
glfwSwapBuffers(Window);
glfwPollEvents();

}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: OpenGL ポリゴンにテクスチャを貼り付けたいが上手く行かない

#2

投稿記事 by みけCAT » 3年前

OpenGLは詳しくないですが、ざっと見た感じだと
  • これから使うはずのテクスチャをいきなりglDeleteTexturesで消してしまっている
  • テクスチャを参照せずに固定の色を返すフラグメントシェーダを使用している
というのがまずそうだと思います。

【参考】
glDeleteTexturesは、紐付けを解除するらしいです。
If a texture that is currently bound is deleted, the binding reverts to 0 (the default texture).
一方、glDeleteShaderは、紐付けを解除しないらしいです。
If a shader object to be deleted is attached to a program object, it will be flagged for deletion, but it will not be deleted until it is no longer attached to any program object, for any rendering context (i.e., it must be detached from wherever it was attached before it will be deleted).
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る