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

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

ただいまの
回答率

87.61%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 667
退会済みユーザー

退会済みユーザー

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

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

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

イメージ説明

#include "Game.hpp"
#include <iostream>


//コンストラクタ
Game::Game()
{
    mIsRunLoop = true;

}

bool Game::RunLoop()
{
    if (mIsRunLoop == true)
    {
        Update();
        GenerateOutput();

    }
    else {
        return false;
    }
    return true;

}


//シェーダー関係のログを取得
void Game::GetShader_Log(GLuint shader_type, GLuint Log_type)
{
    GLint bufferSize = 0;
    GLchar* infoLog = nullptr;

    //成功したかどうか?
    glGetShaderiv(shader_type, Log_type, &bufferSize);


    //ログの長さを取得する
    glGetShaderiv(shader_type, GL_INFO_LOG_LENGTH, &bufferSize);

    infoLog = (GLchar*)malloc(bufferSize);

    if (infoLog != NULL)
    {
        GLsizei length;//ログの長さ    
        glGetShaderInfoLog(shader_type, bufferSize, &length, infoLog);

        if (length > 1)//null文字を含むため一文字以上の場合ログ出力
        {
            fprintf(stderr, "InfoLog:   %s\n\n", infoLog);

        }
    //    printf("ああああ\n");

        free(infoLog);
        infoLog = NULL;
    //    printf("いいいいいい\n");


    }

    //return true;
}

void Game::Shader()
{




    program = glCreateProgram();
    GLuint out_vert = glCreateShader(GL_VERTEX_SHADER);
    GLuint out_frag = glCreateShader(GL_FRAGMENT_SHADER);


    std::string fileName = "Basic.vert";
    std::ifstream shaderfile(fileName);
    if (shaderfile.is_open())
    {
        std::stringstream sstream;
        sstream << shaderfile.rdbuf();
        std::string str = sstream.str();
        const char* cc = str.c_str();

        out_vert = glCreateShader(GL_VERTEX_SHADER);    
        glShaderSource(out_vert, 1, &cc, nullptr);    
        glCompileShader(out_vert);        
        printf("Basic.vert ファイル読み込み\n");

        GetShader_Log(out_vert, GL_COMPILE_STATUS);
        glAttachShader(program, out_vert);        
        shaderfile.close();

    }
    else {
        shaderfile.close();
        printf("Basic.vert読み込みエラー");
    }



    fileName = "Basic.frag";
    shaderfile.open(fileName);

    if (shaderfile.is_open())
    {

        std::stringstream sstream;
        sstream << shaderfile.rdbuf();
        std::string str = sstream.str();
        const char* cc = str.c_str();

        out_frag = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(out_frag, 1, &cc, nullptr);
        glCompileShader(out_frag);
        GetShader_Log(out_frag, GL_COMPILE_STATUS);
        glAttachShader(program, out_frag);    
        shaderfile.close();

        printf("Basic.frag ファイル読み込み\n");
    }
    else {
        shaderfile.close();
        printf("Basic.frag読み込みエラー");
    }



    //シェーダーに値を設定
    /////////////////////////////////////////////////////////////////////////



    //カラーインデックス
    struct Color_idx {
        float R;
        float G;
        float B;

        float A;//不透明度
    };

    float idx[4] = { 1.0,1.0,0.0 , 1.0};



    //フラグメントシェーダー
    glBindAttribLocation(program, 0, "idx");


    //頂点シェーダー
    //glBindAttribLocation(program, 0, "Vertex");
    //void glUniform1fv(GLint location, GLsizei count, const GLfloat* value);
    glUniform1fv(0, 18, Vertex);
    glUniformMatrix3fv(0, 18, GL_TRUE, view);

    //glUniformMatrix3fv(1, 9 ,GL_TRUE,view);


    glLinkProgram(program);

    //Link_log(program);
///////////////////////////////////////////////////////////////////////////
    glDeleteShader(out_frag);
    glDeleteShader(out_vert);
}


//////////////////////初期化
bool Game::Initialization()
{
    Shader();


    glGenVertexArrays(1, &vbo);
    glBindVertexArray(vbo);
    glGenBuffers(1,&vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER,  6 * sizeof(float) * 3, Vertex, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);
    glBindVertexArray(vbo);


    mIsRunLoop = true;
    return mIsRunLoop;
}

//アップデート
void Game::Update()
{

}

//描画アップデート
void Game::GenerateOutput()
{

    glUseProgram(program);

    glDrawArrays(GL_POLYGON, 0, 6);

    glViewport(0,0,640,300);

}
#ifndef ___GMAE_H_
#define ___GMAE_H_

#define WIDTH 640
#define HEIGHT 400

#include "stdio.h"
#include <fstream>
#include <sstream>
#include <iostream>



#include "GLEW/include/GL/glew.h"

#include "gl/GL.h"
#include "GLFW/include/GLFW/glfw3.h"
#include "Vector.hpp"
//#include "Vector.hpp"



class Game 
{
public:
    Vector3 cv;

    Game();

    bool Initialization();

    bool RunLoop();

    void Update();
    void GenerateOutput();


private:
    bool mIsRunLoop;//メインループ




    //ビュー行列
    const GLfloat view[9] = {
        (2.0f / 640.0f),0.0f,0.0f,
        0.0f,(2.0f / 400.0f),0.0f,
        0.0f,0.0f,1.0f
    };


    //頂点バッファー
    const GLfloat Vertex[18] =
    {

        -160, +100, 1.0,
        -160, -100, 1.0,
        +160, -100, 1.0,

        -160, +100, 1.0,
        +160, +100, 1.0,
        +160, -100, 1.0
    };


    GLuint vbo = 0;//頂点配列バッファオブジェクト名
    GLuint vao = 0;//頂点バッファオブジェクト名


    GLuint program = 0;
    void Shader();//シェーダ読み込み
    void Compile_log(GLuint Shader);//シェーダーコンパイルログ
    void Link_log(GLuint Shader);//シェーダーリンクログ

    void GetShader_Log(GLuint shader_type,GLuint Log_type);    

};



#endif
#version 400 
//頂点
layout(Location = 0) in vec4  position;//頂点座標
layout(Location = 1) in mat4  view;//頂点座標

void main()
{
    gl_Position   = position * view;
}
#version 400
//フラグメント
layout(location = 0) in vec4 fragment;
out vec4 f;

void main()
{    


    //f = fragment;

    f = vec4(0.0,0.0,1.0,1.0);
    //fragment = vec4(1.0,0.0,1.0,1.0);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • txty

    2020/09/10 17:37

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/09/10 19:12

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

    キャンセル

  • txty

    2020/09/10 19:15

    わかりました。

    キャンセル

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

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る