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

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

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

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

解決済

1回答

1155閲覧

[opengl] 2Dゲームを作りたい。画像の補間をなくす方法

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

1グッド

0クリップ

投稿2021/04/26 10:09

編集2021/04/26 11:13

提示コードは3Dの行列を使ってz軸を0にすることで2Dのような描画をしているのですが。3Dだと画像の補間が発生してしまいピクセルパーフェクトではありません。自分は画像の補間をなくしたいのでピクセルパーフェクトにしたのですがその場合どのように行うのでしょうか?調べましたがわかりません。

参考サイト: https://www.khronos.org/opengl/wiki/Sampler_Object#Sampling_parameters

cpp

1#include "DrawTest.hpp" 2 3#include <iostream> 4#include "Shader.hpp" 5 6#include <glm/glm.hpp> 7#include <glm/gtx/transform.hpp> 8#include <glm/gtc/matrix_transform.hpp> 9 10//コンストラクタ 11DrawTest::DrawTest() 12{ 13 shader = std::make_shared<Shader>("Basic_2D.vert", "Basic_2D.frag"); //シェーダー 14 15 //頂点配列 16 struct Vertex 17 { 18 GLfloat position[2]; 19 }; 20 21 //頂点情報 22 Vertex rectangleVertex[4] = 23 { 24 //頂点、頂点色 25 {-0.5f,-0.5f}, 26 {0.5f,-0.5f}, 27 {0.5f,0.5f}, 28 {-0.5f,0.5f} 29 }; 30 31 //vao 32 glGenVertexArrays(1, &vao); 33 glBindVertexArray(vao); 34 35 //vbo 36 glGenBuffers(1, &vbo); 37 glBindBuffer(GL_ARRAY_BUFFER, vbo); 38 39 //頂点 40 GLint attrib = shader->getAttribLocation("vertexPosition"); 41 glEnableVertexAttribArray(attrib); 42 glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 43 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0); 44 shader->setBindAttribVertex("vertexPosition"); 45 46 47 //モデル行列 48 vecScale = glm::vec3(1.0f, 1.0f, 1.0f); //拡大縮小 49 vecRotate = glm::vec3(1.0f, 1.0f, 1.0f); //回転 50 angle = 0.0f; //回転量 51 vecTranslate = glm::vec3(0.0f, 0.0f, 0.0f); //平行移動 52 translate = glm::translate(glm::mat4(1), vecTranslate); //平行移動 53 rotate = glm::rotate(angle, vecRotate); //回転 54 scale = glm::scale(glm::mat4(1), vecScale); //拡大縮小 55 56 //ビュー 57 glm::vec3 pos = glm::vec3(0, 0, 1); //座標 58 glm::vec3 center = glm::vec3(0, 0, -1); //向き 59 glm::vec3 up = glm::vec3(0, 1, 0); //上方向 60 view = glm::lookAt(pos, center, up); 61 62 63 projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f);//透視射形 64 65} 66 67//更新 68void DrawTest::Update() 69{ 70 71} 72 73//描画 74void DrawTest::Draw() 75{ 76 shader->setEnable(); 77 78 79 shader->setUniform4f("uFragment", glm::vec4(0.0, 0.0, 1.0, 1.0)); 80 81 shader->setUniformMatrix4fv("uTranslate", translate); 82 shader->setUniformMatrix4fv("uRotate", rotate); 83 shader->setUniformMatrix4fv("uScale", scale); 84 85 shader->setUniformMatrix4fv("uProjection", projection); 86 shader->setUniformMatrix4fv("uView", view); 87 88 89 90 91 92 93 glDrawArrays(GL_LINE_LOOP, 0, 4); 94 95 shader->setDisable(); 96} 97 98//デストラクタ 99DrawTest::~DrawTest() 100{ 101 glDeleteVertexArrays(1, &vao); 102 glDeleteBuffers(1, &vbo); 103} 104 105

glsl

1#extension GL_ARB_explicit_attrib_location: enable 2 3//頂点情報 4layout(location = 0) in vec2 vertexPosition; //頂点座標 5//layout(location = 1) in vec4 vertexColor; //頂点カラー 6 7//フラグメントに転送 8layout(location = 2) out vec4 vFragment; //頂点カラー 9 10 11 12uniform mat4 uScale; //スケール 13uniform mat4 uRotate; //回転 14uniform mat4 uTranslate; //平行移動 15 16uniform mat4 uProjection; //透視行列 17uniform mat4 uView; //ビュー行列 18 19uniform vec4 uFragment; //色 20 21 22void main() 23{ 24 vec4 vertex = vec4(vertexPosition,0.0,1.0); //頂点座標 25 mat4 model = uTranslate * uRotate * uScale; //モデル行列 26 27 28 29 gl_Position = (uProjection * uView * model) * vertex; 30 //gl_Position = vec4(position,0.0,1.0); //座標 31 32 33 34 35 vFragment = uFragment; //カラー 36}

glsl

1#extension GL_ARB_explicit_attrib_location: enable 2 3 4layout(location = 2) in vec4 vfragment; 5 6 7//出力 8out vec4 fragment; 9 10void main() 11{ 12 13 fragment = vfragment; 14 //fragment = vec4(0.0,0.0,1.0,1.0); 15 16}
退会済みユーザー👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/26 11:04

teratail内ですら似たような質問過去にあるんですけど、本当に調べました?
退会済みユーザー

退会済みユーザー

2021/04/26 11:06

調べましたがどうも見つからないため質問しました。
退会済みユーザー

退会済みユーザー

2021/04/26 11:16

パラメータ自分で見つけられたじゃないですか。そのまま調べてみてください。
退会済みユーザー

退会済みユーザー

2021/04/26 11:26

この中のでどれを選べばいいのでしょうか?どれも補間されるので自分のやりたい補間なしのピクセルパーフェクトの補間はないように思えます。
fana

2021/04/27 01:17

画像の補間がどうの…とかいう話が生じそうなコードに見えないのですが…? What is "画像"?
fana

2021/04/27 01:25

「補間をなくす」とはどのような意味か? 「画素が A,B,C,D,E と並び,AとEの色が明示的に与えられているが,残りの B,C,D の色は与えられていない」という場合において B,C,D の色を AやE の色を元にして決定するとき,それを「補間」と呼ぶと思うのだが,それをしないようにするというとき, B,C,D の色をどうしてほしいのか? B,C,D は描画せずに放置されれば良いのか?
退会済みユーザー

退会済みユーザー

2021/04/27 04:22

結局いつも通り、調べましたが判りませんだけで、何をどうやって調べて、どの程度理解出来て、何を自分で検証したかすら質問に説明が無く、自分のソースをそのまま放り投げただけ。丸投げと判断されるのはそういうとこです。
guest

回答1

0

ベストアンサー

参考サイトより3Dの描画を2Dで描画する方法を見つけました。ポイントは透視射形行列ではなく正射形行列を使うことです。2D描画に遠近法は必要ありませんから。下記のサイトで実装出来そうです。

参考サイト(DirectX): http://marupeke296.com/NGDV_No3_Sprite.html
参考サイト(OpenGL): https://learnopengl.com/In-Practice/2D-Game/Rendering-Sprites

投稿2021/04/27 07:23

編集2021/04/27 08:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fana

2021/04/27 08:22

低評価の理由: 「投影方法が orthogonal か perspective か」ということと,「補間」の有無との間には直接的な関係が無いものと考えます. 「遠近法」と「補間」は全く別の話です. 前者は座標値の変換の話であり,後者はレンダリングの方法の話です.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問