2017-04-18 22 views
-2

私は、C++でOpenGLコードを書いて、赤い三角形を画面に描画しました。プログラムは、OpenGL 3.3とglslバージョン330を使用しています。私は、いくつかの.cppクラスファイルまたは私のglslコードで動作しないコードを絞り込んだ。コンパイラやリンカのエラーは出ません(リンカの警告が出ますが、それらは重要だと思いません)。私はエラーが発生する可能性が最も高いと思うコードを与えました。OpenGL三角形がレンダリングされない

Renderer.cpp:

#include "Renderer.h" 

#include <GL/glew.h> 

void Renderer::render(int vbo){ 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDisableVertexAttribArray(0); 
} 

ShaderProgram.cpp

#pragma warning(disable:4101) 

#include "ShaderProgram.h" 

#include <fstream> 
#include <sstream> 

ShaderProgram::ShaderProgram(std::string vertexLocation, std::string fragmentLocation){ 
    programID = glCreateProgram(); 
    vertexID = glCreateShader(GL_VERTEX_SHADER); 
    fragmentID = glCreateShader(GL_FRAGMENT_SHADER); 
    createShader(vertexID, vertexLocation); 
    createShader(fragmentID, fragmentLocation); 
    glLinkProgram(programID); 
    GLint success; 
    glGetProgramiv(programID, GL_LINK_STATUS, &success); 
    if (success == 0) { 
     GLchar ErrorLog[1024]; 
     glGetProgramInfoLog(programID, sizeof(ErrorLog), nullptr, ErrorLog); 
     fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog); 
    } 
    glValidateProgram(programID); 
    glUseProgram(programID); 
} 

void ShaderProgram::createShader(GLint shaderID, std::string srcLocation){ 
    const std::string shaderText = loadShaderSource(srcLocation); 
    const GLchar* shaderSource = shaderText.data(); 
    glShaderSource(shaderID, 1, &shaderSource, nullptr); 
    glCompileShader(shaderID); 
    GLint success; 
    glGetShaderiv(shaderID, GL_COMPILE_STATUS, &success); 
    if (!success) { 
     GLchar InfoLog[1024]; 
     glGetShaderInfoLog(shaderID, sizeof(InfoLog), nullptr, InfoLog); 
     fprintf(stderr, "Error compiling shader: '%s'\n", InfoLog); 
    } 
    glAttachShader(programID, shaderID); 
} 

std::string ShaderProgram::loadShaderSource(std::string location){ 
    std::ifstream file (location); 
    std::string source; 
    std::stringstream stringStream; 

    if (!file.is_open()){ 
     throw std::runtime_error("Could not open file " + location); 
    } 

    stringStream << file.rdbuf(); 
    source = stringStream.str(); 

    return source; 
} 

Entity.cpp

#include "Entity.h" 

Entity::Entity(){ 
    vertices[0] = glm::vec3(-1.0f, -1.0f, 0.0f); 
    vertices[1] = glm::vec3(1.0f, -1.0f, 0.0f); 
    vertices[2] = glm::vec3(0.0f, 1.0f, 0.0f); 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glDisableVertexAttribArray(0); 
} 

int Entity::getID(){ 
    return vbo; 
} 

GLSLコード:
バーテックスシェーダ:

#version 330 

layout (location = 0) in vec3 position; 

void main(){ 
    gl_Position = vec4(0.5 * position.x, 0.5 * position.y, position.z, 1.0); 
} 

フラグメントシェーダ:あなたはそれにGLM :: vec3 this.Referenceように使用カント

#version 330 

out vec4 colour; 

void main(){ 
    colour = vec4(1.0, 0.0, 0.0, 1.0); 
} 
+0

Vertex Array Object(VAO)を使用する必要があります。 – Ripi2

+0

@ Ripi2:VAOは、互換性コンテキストではオプションです。 – genpfault

+0

よろしくお願いいたします。明日私は時間があるときにそれを試してみます。私が従うチュートリアルは、私が推測している最高のものではありません。彼らは私に素晴らしい結果を得ていない – Matty2532

答えて

0

はあなたに取得したその実数配列のanything.Startを提供していません:

glm::vec3 k; 
float* t= &k[0]; 

しかし、私あなたもそれで価値のあることをすることができますか?

はfloat GLfloat配列を使用します。

+0

しかしglm :: value_ptr(k) 'の代わりに'&k [0]'。基本的には同じですが、glmライブラリの推奨方法です。 –

関連する問題