在OpenGL中不渲染三角形

问题描述 投票:0回答:1

我刚刚开始学习OpenGL,但遇到了麻烦:三角形没有渲染。我知道OpenGL在提供错误方面不是很好,但是经过几个小时的尝试后,我在下面的代码中找不到问题。我已经发表了很多评论,以防万一我以错误的顺序执行了某些操作。我还确保了着色器代码正确编译。

#include<glew.h>
#include<glfw3.h>
#include<iostream>
#include<string>
#include"FileReader.h"

void GetInput(GLFWwindow* window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
    glfwSetWindowShouldClose(window, true);
  }
}


int main() {
//vertex buffer data. I know it's spelled wrong.
float vertexes[9]{
   -0.5f, -0.5f, 1.0f,
    0.0f,  0.5f, 1.0f,
    0.5f, -0.5f, 1.0f
};

//index buffer data. I know it's spelled wrong.
unsigned int indexes[3]{
    0, 1, 2
};

//start glfw
if (!glfwInit()) {
    std::cout << "[Fatal Error]Could not start GLFW" << std::endl;
    return -1;
}

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

GLFWwindow* window = glfwCreateWindow(800, 600, "New Window", NULL, NULL);
glfwMakeContextCurrent(window);

//start glew
if (glewInit() != GLEW_OK) {
    std::cout << "[Fatal Error]Failed to start GLEW" << std::endl;
    glfwTerminate();
    return -1;
}


//create vertex buffer
unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), &vertexes, GL_STATIC_DRAW);

//enable layout
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * sizeof(float), 0);

//create index buffer
unsigned int IBO; 
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 1);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * sizeof(unsigned int), &indexes, GL_STATIC_DRAW);

//store the vertex Shader source so it won't be deleted
std::string storeS = readfile("res\\basic.shader", "VertexShader").c_str();
const char* source = storeS.c_str();

//make vertex shader
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &source, NULL);
glCompileShader(vertexShader);

//store the fragment Shader source so it won't be deleted
std::string storeS2 = readfile("res\\basic.shader", "FragmentShader").c_str();
source = storeS2.c_str();

//make fragment shader
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &source, NULL);
glCompileShader(fragmentShader);

//create program
unsigned int shaderProgram;
shaderProgram = glCreateProgram();

//attach shaders to program
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);

glUseProgram(shaderProgram);

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);


//render loop
while (!glfwWindowShouldClose(window)) {

    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);


    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &indexes);

    GetInput(window);
    glfwSwapBuffers(window);
    glfwPollEvents();
}
glfwTerminate();
return 0;

}

c++ opengl glfw glew
1个回答
0
投票

因为已绑定GL_ELEMENT_ARRAY_BUFFER,所以glDrawElements中的最后一个参数指定了绑定缓冲区内的偏移量。相应地,它应该为零,而不是一些大的指针值:

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
© www.soinside.com 2019 - 2024. All rights reserved.