質問編集履歴

2 提示文章を修正しました。

退会済みユーザー

退会済みユーザー

2021/01/26 18:43  投稿

1 / width の計算を行って その値掛ける画像のピクセル数というUV座標のプログラムでは誤差が生じるのか?
提示画像ですが白い矩形の砲弾の画像がおかしくなっています。右の白い縦線の部分が謎なのですがこれは「1 / width の計算を行って その値掛ける画像のピクセル数というUV座標」とう誤差なのでしょうか? 提示コードのDrawGraph()関数部の頂点情報の関数ですがこれが悪いのでしょうか?画像を再度確認しましたがそんな線は入っていません。また画像サイズは0から始まるので引く-1をしてみましたが変わりませんでした。
提示コードのDrawGraph();関数は座標と。その画像の描画する座標の始まりと終わりを指定して描画する関数です。
![イメージ説明](6cf0efe0eb5828c15112a2fe076f91af.jpeg)
```cpp
#include "../Header/Sprite.hpp"
#include "../Header/Shader.hpp"
#include "../Header/Game.hpp"
#include "../Header/Texture.hpp"
#include "../Header/VertexData.hpp"
// 数学ライブラリ
#include "glm/ext.hpp"
#include "glm/glm.hpp"
// OpenCV
#include <opencv2/core.hpp>
class Game;
/*################################################################################################################
* 画像 描画クラス
################################################################################################################*/
//コンストラクタ
/*
* Game クラス
* テクスチャ パス
* 描画する画像の寸法
*/
Sprite::Sprite(class Game* g, const char* FileName) : Transform_2D(g)
{
   shader = new Shader(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
   Owner = g;//Gameクラス
   
   Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0));   //トランスフォームを初期化
   //テクスチャを設定   
   glGenTextures(1, &TextureID);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   float width = 0, height = 0;   //画像の寸法
   int channels = 0;               //画像のチャンネル数
   byte* data = LoadTexture(FileName,width,height,channels);   //テクスチャを取得
   
   //printf("widht: %f\n", width);
   //printf("height: %f\n", height);
   if (data != NULL)
   {
       if (channels == 3)
       {
           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)width, (GLsizei)height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
       }
       else if (channels == 4)
       {
           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
       }
   }
   else {
       std::cerr << "Unable to load texture: " << FileName << std::endl;
   }
   //1ドットのUV数値
   mUVpos.x = 1.0 / width;   //U
   mUVpos.y = 1.0 / height;//V   
   
//   mSize = end - start;   //画像のサイズを取得
//   printf("width: %.2f\n", mSize.x);
//   printf("height: %.2f\n",mSize.y);
   /*
   vertex[0] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f,   0,0 };
   vertex[1] = VertexAttribute_2D{ -width / 2.0f,-height / 2.0f,   0,1 };
   vertex[2] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f,   1,1 };
   vertex[3] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f,   0,0 };
   vertex[4] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f,   1,1 };
   vertex[5] = VertexAttribute_2D{ width / 2.0f,height / 2.0f,   1,0 };
   */
   /*
   *
   // 頂点情報を設定
   vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * uvWidth,start.y * uvHeight };
   vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f,   start.x * uvWidth,end.y * uvHeight };
   vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * uvWidth,end.y * uvHeight };
   vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * uvWidth,start.y * uvHeight };
   vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * uvWidth,end.y * uvHeight };
   vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f,       end.x * uvWidth,start.y * uvHeight };
   */
   //VAO
//   glGenVertexArrays(1, &VAO);
//   glBindVertexArray(VAO);
   //VBO
//   glGenBuffers(1, &VBO);
//   glBindBuffer(GL_ARRAY_BUFFER, VBO);
//   glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
   //頂点座標
//   glEnableVertexAttribArray(0);
//   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
   //UV座標
//   glEnableVertexAttribArray(1);
//   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
   //ミニマップを設定
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glGenerateMipmap(GL_TEXTURE_2D);
   //異方性フィルタリングを設定
   GLfloat largest;
   glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
//   glDeleteBuffers(1, &VAO);
//   glDeleteVertexArrays(1, &VAO);
   delete data;
   data = nullptr;
}
//描画
void Sprite::DrawGraph(glm::vec2 pos, glm::vec2 start, glm::vec2 end)
{
   Transform_2D::UpdateTransform();       //トランスフォームを更新
   Transform_2D::setTransform_Move(pos);   //移動
   shader->Enable();   //シェーダーを有効にする
   shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
   shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
   mSize = end - start;   //画像のサイズを取得
   // 頂点情報を設定
   vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * mUVpos.x,start.y * mUVpos.y };
   vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f,   start.x * mUVpos.x,end.y * mUVpos.y };
   vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * mUVpos.x,end.y * mUVpos.y };
   vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * mUVpos.x,start.y * mUVpos.y };
   vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * mUVpos.x,end.y * mUVpos.y };
   vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f,       end.x * mUVpos.x,start.y * mUVpos.y };
   //VAO
   glGenVertexArrays(1, &VAO);
   glBindVertexArray(VAO);
   //VBO
   glGenBuffers(1, &VBO);
   glBindBuffer(GL_ARRAY_BUFFER, VBO);
   glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
   //頂点座標
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
   //UV座標
   glEnableVertexAttribArray(1);
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
   
   glBindVertexArray(VAO);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));   
   // バッファを解放
   glDeleteBuffers(1,&VAO);
   glDeleteVertexArrays(1,&VAO);
   glBindVertexArray(0);
   glBindTexture(GL_TEXTURE_2D, 0);
}
```
  • C++

    8548 questions

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

1 文章を修正しました。

退会済みユーザー

退会済みユーザー

2021/01/26 17:09  投稿

1 / width の計算を行って その値掛ける画像のピクセル数というUV座標のプログラムでは誤差が生じるのか?
提示画像ですが白い矩形の砲弾の画像がおかしくなっています。右の白い縦線の部分が謎なのですがこれは「1 / width の計算を行って その値掛ける画像のピクセル数というUV座標」とう誤差なのでしょうか? 提示コードのDrawGraph()関数部の頂点情報の関数ですがこれが悪いのでしょうか?
提示画像ですが白い矩形の砲弾の画像がおかしくなっています。右の白い縦線の部分が謎なのですがこれは「1 / width の計算を行って その値掛ける画像のピクセル数というUV座標」とう誤差なのでしょうか? 提示コードのDrawGraph()関数部の頂点情報の関数ですがこれが悪いのでしょうか?画像を再度確認しましたがそんな線は入っていません。また画像サイズは0から始まるので引く-1をしてみましたが変わりませんでした。
![イメージ説明](b8792b819551afbf9d548b98273395c9.jpeg)
![イメージ説明](6cf0efe0eb5828c15112a2fe076f91af.jpeg)
```cpp
#include "../Header/Sprite.hpp"
#include "../Header/Shader.hpp"
#include "../Header/Game.hpp"
#include "../Header/Texture.hpp"
#include "../Header/VertexData.hpp"
// 数学ライブラリ
#include "glm/ext.hpp"
#include "glm/glm.hpp"
// OpenCV
#include <opencv2/core.hpp>
class Game;
/*################################################################################################################
* 画像 描画クラス
################################################################################################################*/
//コンストラクタ
/*
* Game クラス
* テクスチャ パス
* 描画する画像の寸法
*/
Sprite::Sprite(class Game* g, const char* FileName) : Transform_2D(g)
{
   shader = new Shader(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
   Owner = g;//Gameクラス
   
   Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0));   //トランスフォームを初期化
   //テクスチャを設定   
   glGenTextures(1, &TextureID);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   float width = 0, height = 0;   //画像の寸法
   int channels = 0;               //画像のチャンネル数
   byte* data = LoadTexture(FileName,width,height,channels);   //テクスチャを取得
   
   //printf("widht: %f\n", width);
   //printf("height: %f\n", height);
   if (data != NULL)
   {
       if (channels == 3)
       {
           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)width, (GLsizei)height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
       }
       else if (channels == 4)
       {
           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
       }
   }
   else {
       std::cerr << "Unable to load texture: " << FileName << std::endl;
   }
   //1ドットのUV数値
   mUVpos.x = 1.0 / width;   //U
   mUVpos.y = 1.0 / height;//V   
   
//   mSize = end - start;   //画像のサイズを取得
//   printf("width: %.2f\n", mSize.x);
//   printf("height: %.2f\n",mSize.y);
   /*
   vertex[0] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f,   0,0 };
   vertex[1] = VertexAttribute_2D{ -width / 2.0f,-height / 2.0f,   0,1 };
   vertex[2] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f,   1,1 };
   vertex[3] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f,   0,0 };
   vertex[4] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f,   1,1 };
   vertex[5] = VertexAttribute_2D{ width / 2.0f,height / 2.0f,   1,0 };
   */
   /*
   *
   // 頂点情報を設定
   vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * uvWidth,start.y * uvHeight };
   vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f,   start.x * uvWidth,end.y * uvHeight };
   vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * uvWidth,end.y * uvHeight };
   vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * uvWidth,start.y * uvHeight };
   vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * uvWidth,end.y * uvHeight };
   vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f,       end.x * uvWidth,start.y * uvHeight };
   */
   //VAO
//   glGenVertexArrays(1, &VAO);
//   glBindVertexArray(VAO);
   //VBO
//   glGenBuffers(1, &VBO);
//   glBindBuffer(GL_ARRAY_BUFFER, VBO);
//   glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
   //頂点座標
//   glEnableVertexAttribArray(0);
//   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
   //UV座標
//   glEnableVertexAttribArray(1);
//   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
   //ミニマップを設定
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glGenerateMipmap(GL_TEXTURE_2D);
   //異方性フィルタリングを設定
   GLfloat largest;
   glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
//   glDeleteBuffers(1, &VAO);
//   glDeleteVertexArrays(1, &VAO);
   delete data;
   data = nullptr;
}
//描画
void Sprite::DrawGraph(glm::vec2 pos, glm::vec2 start, glm::vec2 end)
{
   Transform_2D::UpdateTransform();       //トランスフォームを更新
   Transform_2D::setTransform_Move(pos);   //移動
   shader->Enable();   //シェーダーを有効にする
   shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
   shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
   mSize = end - start;   //画像のサイズを取得
   // 頂点情報を設定
   vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * mUVpos.x,start.y * mUVpos.y };
   vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f,   start.x * mUVpos.x,end.y * mUVpos.y };
   vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * mUVpos.x,end.y * mUVpos.y };
   vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * mUVpos.x,start.y * mUVpos.y };
   vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * mUVpos.x,end.y * mUVpos.y };
   vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f,       end.x * mUVpos.x,start.y * mUVpos.y };
   //VAO
   glGenVertexArrays(1, &VAO);
   glBindVertexArray(VAO);
   //VBO
   glGenBuffers(1, &VBO);
   glBindBuffer(GL_ARRAY_BUFFER, VBO);
   glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
   //頂点座標
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
   //UV座標
   glEnableVertexAttribArray(1);
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
   
   glBindVertexArray(VAO);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));   
   // バッファを解放
   glDeleteBuffers(1,&VAO);
   glDeleteVertexArrays(1,&VAO);
   glBindVertexArray(0);
   glBindTexture(GL_TEXTURE_2D, 0);
}
```
  • C++

    8548 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る