-2

I've written some OpenGL code in c++ to render a red triangle to the screen. The program uses opengl 3.3 and glsl version 330. I've narrowed down the code that doesn't work to a few .cpp class files or my glsl code. I get no compiler or linker errors (I do get some linker warnings but I dont think those are important). I've given the code in what I believe to be the most likely place for errors to occur.

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 Code:
Vertex Shader:

#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);
}

Fragment Shader:

#version 330

out vec4 colour;

void main(){
    colour = vec4(1.0, 0.0, 0.0, 1.0);
}
Matty2532
  • 50
  • 10

1 Answers1

0

you cant use glm::vec3 like this.Reference to it doesn't provide you anything.Start of its real array obtained :

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

But i doubt you can do something worth with it too.

use just float GLfloat array.

  • But you should use `glm::value_ptr(k)` instead of `&k[0]`. It basically does the same, but it is the suggested method of the glm library. – t.niese Apr 22 '17 at 19:31