質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

1回答

2294閲覧

OpenGL UV展開したテクスチャ画像をobjファイルに適切に貼れない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

0グッド

0クリップ

投稿2021/11/01 11:19

編集2021/11/02 01:19

提示画像ですがblenderで出力したモデルのテクスチャが上下だけ貼れませんこれは何が原因なのでしょうか?画像はUV展開してそれをブレンダーで貼り付けてobjファイルでエクスポートしたのですがなぜ上下のテクスチャだけ貼れないののでしょうか?

※提示画像にライトの立方体がありますが提示コードはライティングは使っていません。

試したこと

ブレンダーでUV座標を指定してテクスチャを設定してエクスポート

イメージ説明
イメージ説明
イメージ説明

Model.cpp
#include "../header/Model.hpp" #include <iostream> #include <sstream> #include <fstream> #include <assert.h> #include <vector> #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h> #include <glm/glm.hpp> #include <GL/glew.h> #include "../lib/stb/stb_image.h" #include "../header/Resource.hpp" #include "../header/Camera.hpp" #include "../header/Window.hpp" #include "../header/Camera.hpp" FrameWork::D3::Object::Object(ObjFile *o, short type) : Render() { renderType = type; obj = o; //オブジェクトファイル } void FrameWork::D3::Object::setTexture(TextureFile *file) { texture = file; glGenTextures(1, &textureID); //テクスチャIDの生成 glBindTexture(GL_TEXTURE_2D, textureID); // IDバインド //テクスチャ生成 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, file->size.x, file->size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, file->fileData); // テクスチャの補間設定 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glGenerateMipmap(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); } void FrameWork::D3::Object::setVertexAttribute(const char *str, int num) { glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); shader->setVertexAttribute(str, num); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } void FrameWork::D3::Object::setVertexBuffer() { glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, obj->attribute.size() * sizeof(VertexAttribute), obj->attribute.data(), GL_STATIC_DRAW); //頂点属性 glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } void FrameWork::D3::Object::setIndexBuffer() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao); glBufferData(GL_ELEMENT_ARRAY_BUFFER, obj->index.size() * sizeof(unsigned int), obj->index.data(), GL_STATIC_DRAW); //頂点インデックス glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void FrameWork::D3::Object::Renderer() { // shader->setEnable(); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBindTexture(GL_TEXTURE_2D, textureID); // IDバインド glActiveTexture(GL_TEXTURE0); //テクスチャ有効 //描画 shader->setUniformMatrix4fv("uTranslate", getMatTranslation()); shader->setUniformMatrix4fv("uRotate", getMatRotate()); shader->setUniformMatrix4fv("uScale", getMatScale()); shader->setUniformMatrix4fv("uViewProjection", FrameWork::Camera::getViewProjection()); if (obj->index.size() > 0) { // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao); // glDrawElements(GL_TRIANGLES, obj->index.size(), GL_UNSIGNED_INT,(void*)0); //描画 // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } else { } glDrawArrays(GL_TRIANGLES, 0, obj->attribute.size()); //描画 //バインド解除 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); // shader->setDisable(); } FrameWork::D3::Object::~Object() { } // ##################################### .objファイル読み込み ##################################### void FrameWork::D3::LoadObj(const char *fileName, ObjFile &attribute) { ObjFile obj; std::vector<int> vertexIndex; std::vector<int> uvIndex; std::vector<int> normalIndex; std::vector<glm::vec3> vertex; std::vector<glm::vec2> uv; std::vector<glm::vec3> normal; FILE *file = fopen(fileName, "r"); if (file == NULL) { std::cerr << ".OBJファイルが開けません: " << fileName << std::endl; assert(0); } else { while (true) { char line[500]; int res = fscanf(file, "%s", line); if (res == EOF) { break; } if (strcmp(line, "v") == 0) { glm::vec3 vert; fscanf(file, "%f %f %fn", &vert.x, &vert.y, &vert.z); vertex.push_back(vert); } else if (strcmp(line, "vt") == 0) { glm::vec2 u; fscanf(file, "%f %fn", &u.x, &u.y); uv.push_back(u); } else if (strcmp(line, "vn") == 0) { glm::vec3 norm; fscanf(file, "%f %f %fn", &norm.x, &norm.y, &norm.z); normal.push_back(norm); } else if (strcmp(line, "f") == 0) { unsigned int v[3], u[3], n[3]; int matches = fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%dn", &v[0], &u[0], &n[0], &v[1], &u[1], &n[1], &v[2], &u[2], &n[2]); vertexIndex.push_back(v[0]); vertexIndex.push_back(v[1]); vertexIndex.push_back(v[2]); uvIndex.push_back(u[0]); uvIndex.push_back(u[1]); uvIndex.push_back(u[2]); normalIndex.push_back(n[0]); normalIndex.push_back(n[1]); normalIndex.push_back(n[2]); } } for (unsigned int i = 0; i < vertexIndex.size(); i++) { unsigned int vi = vertexIndex[i]; unsigned int ui = uvIndex[i]; unsigned int ni = normalIndex[i]; glm::vec3 v = vertex[vi - 1]; glm::vec2 u = uv[ui - 1]; glm::vec3 n = normal[ni - 1]; VertexAttribute attrib; attrib.position[0] = v.x; attrib.position[1] = v.y; attrib.position[2] = v.z; attrib.uv[0] = u.x; attrib.uv[1] = u.y; attrib.normal[0] = n.x; attrib.normal[1] = n.y; attrib.normal[2] = n.z; obj.attribute.push_back(attrib); } } attribute = obj; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/11/01 13:52

コードを見ていないので推測ですが、 ライトが横から照らされているということは無いでしょうか? もしそうであれば、ライトを上から照らすようにしてみては如何でしょう?
退会済みユーザー

退会済みユーザー

2021/11/02 00:36

いえ。このコードはライト無しの単純なテクスチャ描画です。
fana

2021/11/02 01:29

テクスチャ画像は「†」な形になっていて,四隅に余白がありますね. 試しにテクスチャ用画像の4か所の余白部分を{赤,青,黄,緑}とか適当な色にしたならば,「テクスチャが貼れない」とされている面にそれらの色のいずれかが出てきたりはしないのでしょうか?
guest

回答1

0

ベストアンサー

以下のテクスチャを使うことによってUV座標がずれていることが原因でテクスチャが描画されていないことが判明しました。

※ 三枚目の画像はblenderのUV展開の表示ですがなぜか真ん中を中心に展開していているのでうがこれまた別問題です。

![イメージ説明]
イメージ説明
イメージ説明

投稿2021/11/02 01:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cure_fontaine

2022/02/28 03:08

このH1~A8の画像はコピーして使わせていただき、役に立ちました。ありがとう!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問