私はC++を学び始めました。色付きの三角形を描画するシェーダを使ってプログラムを作成しようとしています。C++ OpenGLシェーダが動作しない
これは私の頂点シェーダです:
const GLchar* vertexSource =
"#version 150 core\n"
"in vec4 position;"
"in vec4 color;"
"out vec4 Color;"
"out vec4 gl_Position;"
"void main(){"
" gl_Position = position;"
" Color = color;"
"}";
と、これは私のフラグメントシェーダです:
const GLchar* fragmentSource =
"#version 150 core\n"
"in vec4 Color;"
"out vec4 gl_FragColor"
"void main(){"
" gl_FragColor = Color;"
"}";
私はそれぞれ共同ordsと色の値のリストを持っている:
float vertices[]{
-1.0f, -1.0f, 0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f,
1.0f, -1.0f, 0.0f,1.0f, 0.0f,1.0f,0.0f,1.0f,
0.0f, 1.0f, 0.0f,1.0f, 0.0f,0.0f,1.0f,1.0f,
};
「頂点バッファオブジェクト」と「頂点アレイオブジェクト」を初期化します
ループ 'ながら、行う'glBindAttribLocation(shaderProgram, 0, "position");
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0);
glEnableVertexAttribArray(0);
glBindAttribLocation(shaderProgram, 1 ,"color");
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(4 * sizeof(float)));
glEnableVertexAttribArray(1);
をし、最終的に私は三角形を描く:
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
私はシェーダのためのいくつかの属性を定義します
GLuint vao; //Initialise vertex array object
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo; //Initialise vertex buffer object
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
私はシェーダプログラムをコンパイル
glDrawArrays(GL_TRIANGLES, 0, 3);
しかし、三角形は印刷されませんが、代わりに 黒いスクリーン。
私はチュートリアルのオンラインからこのコードの大半を得て、すべてのことがどのように機能するかを理解するためにすべてを書き直そうとしています。
どこに間違っていたのか誰にでも見えますか?何かアドバイスをいただければ幸いです:)
が編集:私はエラーをチェックするためにいくつかのコードを追加しました
:
if (status == GL_FALSE)
{
GLint infoLogLength;
glGetShaderiv(shaderProgram, GL_INFO_LOG_LENGTH, &infoLogLength);
GLchar* strInfoLog = new GLchar[infoLogLength + 1];
glGetProgramInfoLog(shaderProgram, infoLogLength, NULL, strInfoLog);
std::cout << strInfoLog;
delete[] strInfoLog;
}
...しかし、何も印刷さ
まず、 '/ n'は' \ n'と同じではありません。次に、シェーダのコンパイル時にエラーメッセージがないかどうかを確認する必要があります。 'glGetShaderInfoLog()'を使用してください。 –
あなたは、あなたが問題を抱えていることを述べなかった、コンパイルエラー?描画の問題? –
プログラムを実行すると空白の画面が表示される –