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

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

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

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

C++

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

Q&A

0回答

1040閲覧

OpenGL ワールド座標から正規化座標に変換する方法が知りたい。計算式

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

1クリップ

投稿2020/09/10 00:06

編集2020/09/10 10:11

質問1、提示コードのメイン関数部です。 画面サイズは(640,400)ピクセルです。OpenGLなので左手座標系です。そこで自分は画面サイズ上での頂点座標を作成しました。正規化座標である(+1 ~ -1) に戻し画面に描画させたいです。提示コードの座標ではすべて0.5と-0.5になるはずです。つまり正方形を描画させたいのですが上手くいきませんこれはどうしたらいいのでしょうか?

質問2、またシェーダーで4 x (4x4)の行列で(3x3)と3までの値しか使っていないのですがこれは大丈夫なのでしょうか?

質問3、この処理をコンソール出力(新規プロジェクト)で確認したあとシェーダーに乗っけたいのですがどうするのが適切なのでしょうか?

イメージ説明

cpp

1#include "Game.hpp" 2#include <iostream> 3 4 5//コンストラクタ 6Game::Game() 7{ 8 mIsRunLoop = true; 9 10} 11 12bool Game::RunLoop() 13{ 14 if (mIsRunLoop == true) 15 { 16 Update(); 17 GenerateOutput(); 18 19 } 20 else { 21 return false; 22 } 23 return true; 24 25} 26 27 28//シェーダー関係のログを取得 29void Game::GetShader_Log(GLuint shader_type, GLuint Log_type) 30{ 31 GLint bufferSize = 0; 32 GLchar* infoLog = nullptr; 33 34 //成功したかどうか? 35 glGetShaderiv(shader_type, Log_type, &bufferSize); 36 37 38 //ログの長さを取得する 39 glGetShaderiv(shader_type, GL_INFO_LOG_LENGTH, &bufferSize); 40 41 infoLog = (GLchar*)malloc(bufferSize); 42 43 if (infoLog != NULL) 44 { 45 GLsizei length;//ログの長さ 46 glGetShaderInfoLog(shader_type, bufferSize, &length, infoLog); 47 48 if (length > 1)//null文字を含むため一文字以上の場合ログ出力 49 { 50 fprintf(stderr, "InfoLog: %s\n\n", infoLog); 51 52 } 53 // printf("ああああ\n"); 54 55 free(infoLog); 56 infoLog = NULL; 57 // printf("いいいいいい\n"); 58 59 60 } 61 62 //return true; 63} 64 65void Game::Shader() 66{ 67 68 69 70 71 program = glCreateProgram(); 72 GLuint out_vert = glCreateShader(GL_VERTEX_SHADER); 73 GLuint out_frag = glCreateShader(GL_FRAGMENT_SHADER); 74 75 76 std::string fileName = "Basic.vert"; 77 std::ifstream shaderfile(fileName); 78 if (shaderfile.is_open()) 79 { 80 std::stringstream sstream; 81 sstream << shaderfile.rdbuf(); 82 std::string str = sstream.str(); 83 const char* cc = str.c_str(); 84 85 out_vert = glCreateShader(GL_VERTEX_SHADER); 86 glShaderSource(out_vert, 1, &cc, nullptr); 87 glCompileShader(out_vert); 88 printf("Basic.vert ファイル読み込み\n"); 89 90 GetShader_Log(out_vert, GL_COMPILE_STATUS); 91 glAttachShader(program, out_vert); 92 shaderfile.close(); 93 94 } 95 else { 96 shaderfile.close(); 97 printf("Basic.vert読み込みエラー"); 98 } 99 100 101 102 fileName = "Basic.frag"; 103 shaderfile.open(fileName); 104 105 if (shaderfile.is_open()) 106 { 107 108 std::stringstream sstream; 109 sstream << shaderfile.rdbuf(); 110 std::string str = sstream.str(); 111 const char* cc = str.c_str(); 112 113 out_frag = glCreateShader(GL_FRAGMENT_SHADER); 114 glShaderSource(out_frag, 1, &cc, nullptr); 115 glCompileShader(out_frag); 116 GetShader_Log(out_frag, GL_COMPILE_STATUS); 117 glAttachShader(program, out_frag); 118 shaderfile.close(); 119 120 printf("Basic.frag ファイル読み込み\n"); 121 } 122 else { 123 shaderfile.close(); 124 printf("Basic.frag読み込みエラー"); 125 } 126 127 128 129 //シェーダーに値を設定 130 ///////////////////////////////////////////////////////////////////////// 131 132 133 134 //カラーインデックス 135 struct Color_idx { 136 float R; 137 float G; 138 float B; 139 140 float A;//不透明度 141 }; 142 143 float idx[4] = { 1.0,1.0,0.0 , 1.0}; 144 145 146 147 //フラグメントシェーダー 148 glBindAttribLocation(program, 0, "idx"); 149 150 151 //頂点シェーダー 152 //glBindAttribLocation(program, 0, "Vertex"); 153 //void glUniform1fv(GLint location, GLsizei count, const GLfloat* value); 154 glUniform1fv(0, 18, Vertex); 155 glUniformMatrix3fv(0, 18, GL_TRUE, view); 156 157 //glUniformMatrix3fv(1, 9 ,GL_TRUE,view); 158 159 160 glLinkProgram(program); 161 162 //Link_log(program); 163/////////////////////////////////////////////////////////////////////////// 164 glDeleteShader(out_frag); 165 glDeleteShader(out_vert); 166} 167 168 169//////////////////////初期化 170bool Game::Initialization() 171{ 172 Shader(); 173 174 175 glGenVertexArrays(1, &vbo); 176 glBindVertexArray(vbo); 177 glGenBuffers(1,&vbo); 178 glBindBuffer(GL_ARRAY_BUFFER, vbo); 179 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float) * 3, Vertex, GL_STATIC_DRAW); 180 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 181 glEnableVertexAttribArray(0); 182 glBindVertexArray(vbo); 183 184 185 mIsRunLoop = true; 186 return mIsRunLoop; 187} 188 189//アップデート 190void Game::Update() 191{ 192 193} 194 195//描画アップデート 196void Game::GenerateOutput() 197{ 198 199 glUseProgram(program); 200 201 glDrawArrays(GL_POLYGON, 0, 6); 202 203 glViewport(0,0,640,300); 204 205} 206

hpp

1#ifndef ___GMAE_H_ 2#define ___GMAE_H_ 3 4#define WIDTH 640 5#define HEIGHT 400 6 7#include "stdio.h" 8#include <fstream> 9#include <sstream> 10#include <iostream> 11 12 13 14#include "GLEW/include/GL/glew.h" 15 16#include "gl/GL.h" 17#include "GLFW/include/GLFW/glfw3.h" 18#include "Vector.hpp" 19//#include "Vector.hpp" 20 21 22 23class Game 24{ 25public: 26 Vector3 cv; 27 28 Game(); 29 30 bool Initialization(); 31 32 bool RunLoop(); 33 34 void Update(); 35 void GenerateOutput(); 36 37 38private: 39 bool mIsRunLoop;//メインループ 40 41 42 43 44 //ビュー行列 45 const GLfloat view[9] = { 46 (2.0f / 640.0f),0.0f,0.0f, 47 0.0f,(2.0f / 400.0f),0.0f, 48 0.0f,0.0f,1.0f 49 }; 50 51 52 //頂点バッファー 53 const GLfloat Vertex[18] = 54 { 55 56 -160, +100, 1.0, 57 -160, -100, 1.0, 58 +160, -100, 1.0, 59 60 -160, +100, 1.0, 61 +160, +100, 1.0, 62 +160, -100, 1.0 63 }; 64 65 66 GLuint vbo = 0;//頂点配列バッファオブジェクト名 67 GLuint vao = 0;//頂点バッファオブジェクト名 68 69 70 GLuint program = 0; 71 void Shader();//シェーダ読み込み 72 void Compile_log(GLuint Shader);//シェーダーコンパイルログ 73 void Link_log(GLuint Shader);//シェーダーリンクログ 74 75 void GetShader_Log(GLuint shader_type,GLuint Log_type); 76 77}; 78 79 80 81#endif 82

GLSL

1#version 400 2//頂点 3layout(Location = 0) in vec4 position;//頂点座標 4layout(Location = 1) in mat4 view;//頂点座標 5 6void main() 7{ 8 gl_Position = position * view; 9} 10 11

GLSL

1#version 400 2//フラグメント 3layout(location = 0) in vec4 fragment; 4out vec4 f; 5 6void main() 7{ 8 9 10 //f = fragment; 11 12 f = vec4(0.0,0.0,1.0,1.0); 13 //fragment = vec4(1.0,0.0,1.0,1.0); 14}

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

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

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

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

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

txty

2020/09/10 02:01

正規化座標ってなんですか?
退会済みユーザー

退会済みユーザー

2020/09/10 02:02

正規化座標(1.0 ~ -1.0) 座標です。
txty

2020/09/10 07:45 編集

正規化の計算がうまくいけばいいのですか?検討違いですか?法線計算じゃないから関係ないですよね。第一計算しなくてもそれ含まれてるみたいだし。実際は、知らないけど。(法線計算しなくても私のオブジェクトはうまくでているのが根拠)
fana

2020/09/10 02:29

> 画面サイズ(640,400.1)のワールド座標 っていう話が,かなり説明不足というか不明瞭に感じます. 「画面サイズ」って言われたら,その640とかの単位は[pixel]かな?と想像してしまいますが ワールド座標の単位が[pixel]ってことはないでしょうし…? 一体どのような世界(投影関係)を考えているのかを具体的に明示しないと伝わらない話に思えます.
txty

2020/09/10 03:54 編集

すごく自信ないけど、 glMatrixMode(GL_PROJECTION);//モード切替え glLoadIdentity(); ///行列リセット glOrtho(-1, 1, -1, 1, 2, 4); //「透視射影」の設定 これじゃ駄目なんですよね。計算式欲しいみたいだし。モード切替があってるかわからない。
txty

2020/09/10 08:37

質問なのですが発言どうり、テクスチャーつけれるまで頑張ってもらえるんでしょうか。テクスチャーの形式は何をお考えでしょうか。
退会済みユーザー

退会済みユーザー

2020/09/10 10:12

質問内容を変更しました。まだテクスチャまでは考えていませんとりえず色で表示させたいです。
txty

2020/09/10 10:15

わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問