以下の提示コードですが下のシェーダーコードですがなぜ色が適用されないのでしょうか?
フラグメントシェーダー部で = vec4(1,0,0,0.5);などと指定すると色が変えられますが。頂点に色を設定するやり方だと色が適用されません。
どうすればいいのでしょうか?
変数名を確認
エラーログは出ない。
コンパイルは成功している。
色々デバッグしましたがどう考えても場所はここです。何をしていないのでしょうか?
hpp
1#ifndef ___LINE_HPP_ 2#define ___LINE_HPP_ 3 4//自作ヘッダー 5#include "Transform_2D_Component.hpp" 6#include "ShaderComponent.hpp" 7//標準ヘッダー関係 8#include "stdio.h" 9#include <fstream> 10#include <sstream> 11#include <iostream> 12#include <vector> 13 14//OpenGL関係 15#include "GLEW/include/GL/glew.h" 16#include "gl/GL.h" 17#include "GLFW/include/GLFW/glfw3.h" 18 19//数学ライブラリ 20#include "glm/ext.hpp" 21#include "glm/glm.hpp" 22 23/*################################################################################################################ 24# 単色 線 描画クラス 25##################################################################################################################*/ 26 27class Line : public Transform_2D 28{ 29public: 30 31 Line(class Game* g, glm::ivec4 clr, glm::vec2 size); 32 33 34 void DrawGraph(int x, int y); //描画 35 36 37private: 38 39 //頂点属性 40 struct attribute 41 { 42 GLfloat position[2]; 43 GLfloat Color[4]; 44 }; 45 46 47 attribute vertex[2]; 48// attribute vertex[4]; 49 glm::vec2 mSize; 50 51 52 Game* game; 53 54 55 //インデックス配列 56 unsigned int index[2] = { 57 0,1 58 59 }; 60 /* 61 unsigned int index[6] = { 62 0,1,2, 63 0,3,2 64 }; 65 */ 66 67 //OpenGL 関係 68 GLuint VAO; 69 GLuint VBO; 70 GLuint IBO; 71 72 73 Shader* shader; //シェーダープログラム 74 75}; 76 77#endif
cpp
1#include "../Header/ShaderComponent.hpp" 2#include "../Header/Game.hpp" 3 4 5/*################################################################################################################ 6# 単色 矩形 描画クラス 7##################################################################################################################*/ 8//コンストラクタ 9Line::Line(class Game* g, glm::ivec4 clr, glm::vec2 size) : Transform_2D() 10{ 11 shader = new Shader(g, "Shader/2D/Line.vert", "Shader/2D/Line.frag"); 12// shader = new Shader(g, "Shader/2D/Rectangle.vert", "Shader/2D/Rectangle.frag"); 13 14 game = g;//Gameクラス 15 16 vertex[0] = attribute{ 100,100,1,0,0,0.5 }; 17 vertex[1] = attribute{ 200,-200,1,0,0,0.5 }; 18 19 20 mSize = size; 21 //VAO 22 glGenVertexArrays(1, &VAO); 23 glBindVertexArray(VAO); 24 25 //VBO 26 glGenBuffers(1, &VBO); 27 glBindBuffer(GL_ARRAY_BUFFER, VBO); 28 glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(attribute), vertex, GL_STATIC_DRAW); 29 30 //頂点座標 31 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(attribute), NULL); 32 glEnableVertexAttribArray(0); 33 34 glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 2, NULL); 35 glEnableVertexAttribArray(1); 36 37 38 //IBO 39 glGenBuffers(1, &IBO); 40 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); 41 glBufferData(GL_ELEMENT_ARRAY_BUFFER, (sizeof(index) / sizeof(index[0])) * sizeof(unsigned int), index, GL_STATIC_DRAW); 42 43} 44 45//描画 46void Line::DrawGraph(int x, int y) 47{ 48 shader->Enable(); 49 50 51 int xx = (int)((-SCREEN_WIDTH / 2) + (mSize.x / 2.0)) + x; 52 int yy = (int)((SCREEN_HEIGHT / 2) - (mSize.y / 2.0)) - y; 53 54 55 setTransform_Move(glm::ivec2(xx, yy)); 56 57 58 59 shader->SetFloatUniform_3m("ViewMatrix", getViewMatrix()); 60 shader->SetFloatUniform_3m("WorldMatrix", getWorldMatrix()); 61 //shader->SetFloatUniform_4f("fragColor", glm::vec4(1.0f, 0.0f, 0.0f, 0.5f)); 62 63 64 glBindVertexArray(VAO); 65 glDrawElements(GL_LINES, sizeof(index), GL_UNSIGNED_INT, NULL); 66 67}
/*############################################################################################################### * 2D 線 描画 .vert ###############################################################################################################*/ #version 400 layout (location = 0) in vec2 pos; layout (location = 1) in vec4 fragColor; uniform mat3 ViewMatrix; uniform mat3 WorldMatrix; out vec4 out_Color; void main() { out_Color = fragColor;//色情報をフラグメントに渡す vec3 position = vec3(pos,1.0); gl_Position = vec4(position * WorldMatrix * ViewMatrix ,1.0); }
/*############################################################################################################### * 2D 線 描画 .frag ###############################################################################################################*/ #version 400 out vec4 Color; in vec4 out_Color; void main() { //Color = out_Color; float r = (1.0f / 255.0 ) * 192; float g = (1.0f / 255.0 ) * 48; float b = (1.0f / 255.0 ) * 192; // Color = out_Color; Color = vec4(r,g,b,1); }
頂点座標の設定のところ、glVertexAttribPointer の引数が微妙におかしい気がします。
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(attribute), 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(attribute), (void*) (sizeof(GLfloat) * 2));
のような。
訂正: glVertexAttribPointer と glEnableVertexAttribArray の順番は関係ない気がしてきました…。
あなたの回答
tips
プレビュー