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

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

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

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

C++

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

Q&A

解決済

1回答

742閲覧

opengl 正射投影で2Dスプライトを等倍のサイズで描画する方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2022/02/04 07:32

編集2022/02/04 08:05

提示画像ですがこれは(32,32)のスプライト画像で画面サイズが(960,540)なのですが画像のキャラクタが異常に大きい原因がわかりません
おそらく倍の大きさで描画されていることが原因だと思うんですがこれは何が悪いのでしょうか?

Sprite.cppのsetSize()関数の値をいろいろ変更しましたが等倍にないません

参考サイト: https://johnnn.tech/q/opengl-move-2d-ortho-camera-with-mouse/
イメージ説明

Camera.cpp

cpp

1 2// ##################################### 座標を設定 ##################################### 3void FrameWork::Camera::setPosition(glm::vec3 p) 4{ 5 position = p; //座標 6 7 glm::vec3 up = glm::vec3(0, 1, 0); 8 glm::vec3 cameraDirection = glm::normalize(position - vecLook); 9 glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection)); 10 glm::vec3 cameraUp = glm::cross(vecLook, cameraRight); 11 12 view = glm::lookAt(position, position + vecLook, up); 13} 14 15// ##################################### 視線を設定 ##################################### 16void FrameWork::Camera::setLook(glm::vec3 l) 17{ 18 vecLook = l; //向き 19 20 glm::vec3 up = glm::vec3(0, 1, 0); 21 glm::vec3 cameraDirection = glm::normalize(position - vecLook); 22 glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection)); 23 glm::vec3 cameraUp = glm::cross(vecLook, cameraRight); 24 25 view = glm::lookAt(position, position + vecLook,up); 26} 27 28// ##################################### 正射投影行列 ##################################### 29glm::mat4 FrameWork::Camera::getViewOrthographic() 30{ 31 //return glm::ortho(-0.5f, 0.5f, -0.5f, 0.5f, 0.1f, 100.0f) * view; 32 return glm::ortho(-(float)windowContext->getSize().x / 2.0f, (float)windowContext->getSize().y / 2.0f, 33 -(float)windowContext->getSize().x /2.0f , (float)windowContext->getSize().y / 2.0f,0.1f, 100.0f) * view; 34} 35 36
Srpite.cpp

cpp

1#include "../header/Sprite.hpp" 2 3#include <array> 4#include <memory> 5 6#include <GL/glew.h> 7#include <glm/glm.hpp> 8#include <glm/gtc/type_ptr.hpp> 9#include <glm/gtc/quaternion.hpp> 10#include <glm/gtc/type_ptr.hpp> 11#include <glm/gtx/transform.hpp> 12#include <glm/gtc/matrix_transform.hpp> 13 14#include "../header/Resource.hpp" 15#include "../header/Shader.hpp" 16#include "../header/Vertex.hpp" 17#include "../header/Sprite.hpp" 18#include "../header/Shader.hpp" 19#include "../header/Window.hpp" 20#include "../header/Init.hpp" 21 22 23 24FrameWork::Sprite::Sprite() : Render() 25{ 26 vao = 0; 27 vbo = 0; 28 29 glGenVertexArrays(1, &vao); 30 glGenBuffers(1, &vbo); 31 32 glBindVertexArray(vao); 33 glBindBuffer(GL_ARRAY_BUFFER, vbo); 34 35 shader = std::make_shared<Shader>(); 36 shader->Load("Asset/shader/2D/BasicTexture_2D.vert","Asset/shader/2D/BasicTexture_2D.frag"); 37 38 shader->setEnable(); 39 40 glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(VertexAttributeSprite), (float*)vertex.data(), GL_DYNAMIC_DRAW); 41 42 GLuint attrib = shader->getAttribLocation("vertexPosition"); 43 glEnableVertexAttribArray(attrib); 44 glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, (sizeof(VertexAttributeSprite) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 0)); 45 shader->setBindAttribLocation("vertexPosition"); 46 47 attrib = shader->getAttribLocation("vertexUV"); 48 glEnableVertexAttribArray(attrib); 49 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, (sizeof(VertexAttributeSprite) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 3)); 50 shader->setBindAttribLocation("vertexUV"); 51 52 shader->setDisable(); 53 glBindVertexArray(0); 54 glBindBuffer(GL_ARRAY_BUFFER, 0); 55 56} 57 58// ##################################### 描画 ##################################### 59void FrameWork::Sprite::Renderer(const glm::mat4 view,const FrameWork::Texture texture,const glm::vec3 position,const glm::ivec2 startSize,const glm::ivec2 endSize) 60{ 61 shader->setEnable(); 62 glm::vec2 screenSize = glm::vec2(1.0f / windowContext->getSize().x,1.0f / windowContext->getSize().y); 63 glBindVertexArray(vao); 64 glBindBuffer(GL_ARRAY_BUFFER, vbo); 65 66 setSize(startSize,endSize); 67 setUV(startSize, endSize,texture.size); 68 69 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttributeSprite) * vertex.size(), vertex.data()); 70 71// Transform::setPosition(glm::vec3(screenSize.x * position.x,screenSize.y * position.y,0)); 72 Transform::setPosition(glm::vec3(position.x,position.y,0)); 73 Transform::setRotate(glm::vec3(0, 0, 1), 0); 74 Transform::setScale(glm::vec3(endSize - startSize,1)); 75 76 shader->setUniformSampler2D("uImage",0,texture.ID); 77 shader->setUniformMatrix4fv("uTranslate", Transform::getMatTranslation()); 78 shader->setUniformMatrix4fv("uRotate", Transform::getMatRotate()); 79 shader->setUniformMatrix4fv("uScale", Transform::getMatScale()); 80 shader->setUniformMatrix4fv("uViewProjection", view); 81 82 glDrawArrays(GL_TRIANGLES,0,vertex.size()); 83 84 glBindVertexArray(0); 85 glBindBuffer(GL_ARRAY_BUFFER, 0); 86 shader->setDisable(); 87 88} 89 90// ##################################### 頂点 ##################################### 91void FrameWork::Sprite::setSize(const glm::vec2 startSize,const glm::vec2 endSize) 92{ 93 94 glm::vec2 scr = glm::ivec2(1,1); 95 scr.x =1; 96 scr.y = 1; 97 98 // 頂点座標 99 vertex[0].position.x = -scr.x; 100 vertex[0].position.y = scr.y; 101 vertex[0].position.z = 0; 102 103 vertex[1].position.x = -scr.x; 104 vertex[1].position.y = -scr.y; 105 vertex[1].position.z = 0; 106 107 vertex[2].position.x = scr.x; 108 vertex[2].position.y = scr.y; 109 vertex[2].position.z = 0; 110 111 vertex[3].position.x = scr.x; 112 vertex[3].position.y = scr.y; 113 vertex[3].position.z = 0; 114 115 vertex[4].position.x = -scr.x; 116 vertex[4].position.y = -scr.y; 117 vertex[4].position.z = 0; 118 119 vertex[5].position.x = scr.x; 120 vertex[5].position.y = -scr.y; 121 vertex[5].position.z = 0; 122} 123 124 125 126 127// ##################################### 頂点 ##################################### 128void FrameWork::Sprite::setUV(const glm::vec2 startSize, const glm::vec2 endSize,const glm::ivec2 textureSize) 129{ 130 glm::vec2 size = endSize - startSize; 131 132 133 //UV座標 134 float sizeX = 1.0f / (float)textureSize.x; 135 float sizeY = 1.0f / (float)textureSize.y; 136 137 FrameWork::Sprite::vertex[0].uv.x = sizeX * startSize.x; 138 FrameWork::Sprite::vertex[0].uv.y = sizeY * startSize.y; 139 140 FrameWork::Sprite::vertex[1].uv.x = sizeX * startSize.x; 141 FrameWork::Sprite::vertex[1].uv.y = sizeY * endSize.y; 142 143 FrameWork::Sprite::vertex[2].uv.x = sizeX * endSize.x; 144 FrameWork::Sprite::vertex[2].uv.y = sizeY * startSize.y; 145 146 FrameWork::Sprite::vertex[3].uv.x = sizeX * endSize.x; 147 FrameWork::Sprite::vertex[3].uv.y = sizeY * startSize.y; 148 149 FrameWork::Sprite::vertex[4].uv.x = sizeX * startSize.x; 150 FrameWork::Sprite::vertex[4].uv.y = sizeY * endSize.y; 151 152 FrameWork::Sprite::vertex[5].uv.x = sizeX * endSize.x; 153 FrameWork::Sprite::vertex[5].uv.y = sizeY * endSize.y; 154} 155 156FrameWork::Sprite::~Sprite() 157{ 158 159}

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

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

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

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

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

fana

2022/02/04 08:22 編集

> Sprite.cppのsetSize()関数の値をいろいろ変更しましたが とのことですが,このメソッドは引数を完全に無視しているように見えますぞ. これでは引数を変えても効果ありませんな.
guest

回答1

0

ベストアンサー

以下のようにして解決しました。

cpp

1glm::vec2 scr = glm::ivec2(1,1); 2 scr.x =1 .0f/2.0f; 3 scr.y =1 .0f/2.0f; 4

投稿2022/02/04 08:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問