[英]OpenGL Colored Square
I want to draw a cube to the screen that has random interpolated colors with OpenGL 4.1 and on OS X Yosemite. 我想在OpenGL 4.1和OS X Yosemite上向具有随机插值颜色的屏幕绘制一个立方体。 Whenever I run this program (it compiles fine), I get nothing, just a blank, blue screen. 每当我运行该程序(编译正常)时,我什么都没有,只有空白的蓝屏。 Here's my code: 这是我的代码:
#include <glm/gtc/matrix_transform.hpp>
#include <stdio.h>
#include "myglutils.hpp"
static const int vertices = 12 * 3;
static const GLfloat points[] = {
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
};
static const GLfloat colors[] = {
0.583f, 0.771f, 0.014f,
0.609f, 0.115f, 0.436f,
0.327f, 0.483f, 0.844f,
0.822f, 0.569f, 0.201f,
0.435f, 0.602f, 0.223f,
0.310f, 0.747f, 0.185f,
0.597f, 0.770f, 0.761f,
0.559f, 0.436f, 0.730f,
0.359f, 0.583f, 0.152f,
0.483f, 0.596f, 0.789f,
0.559f, 0.861f, 0.639f,
0.195f, 0.548f, 0.859f,
0.014f, 0.184f, 0.576f,
0.771f, 0.328f, 0.970f,
0.406f, 0.615f, 0.116f,
0.676f, 0.977f, 0.133f,
0.971f, 0.572f, 0.833f,
0.140f, 0.616f, 0.489f,
0.997f, 0.513f, 0.064f,
0.945f, 0.719f, 0.592f,
0.543f, 0.021f, 0.978f,
0.279f, 0.317f, 0.505f,
0.167f, 0.620f, 0.077f,
0.347f, 0.857f, 0.137f,
0.055f, 0.953f, 0.042f,
0.714f, 0.505f, 0.345f,
0.783f, 0.290f, 0.734f,
0.722f, 0.645f, 0.174f,
0.302f, 0.455f, 0.848f,
0.225f, 0.587f, 0.040f,
0.517f, 0.713f, 0.338f,
0.053f, 0.959f, 0.120f,
0.393f, 0.621f, 0.362f,
0.673f, 0.211f, 0.457f,
0.820f, 0.883f, 0.371f,
0.982f, 0.099f, 0.879f
};
int main() {
if (!setupGLFW()) return 1;
setupApple();
glfwWindowHint(GLFW_SAMPLES, 4);
GLFWwindow* window = glfwCreateWindow(640, 480, "Colored Cube", NULL, NULL);
if (!window) {
fprintf(stderr, "Window creation failed.\n");
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
if (!setupGLEW()) return 1;
glClearColor(0.2, 0.0, 0.8, 1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
GLuint p_buffer;
glGenBuffers(1, &p_buffer);
glBindBuffer(GL_ARRAY_BUFFER, p_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
GLuint c_buffer;
glGenBuffers(1, &c_buffer);
glBindBuffer(GL_ARRAY_BUFFER, c_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, p_buffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, c_buffer);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
const char* vertex_shader =
"#version 410\n"
"layout(location = 0) in vec3 pos;"
"layout(location = 1) in vec3 in_color;"
"out vec3 color;"
"uniform mat4 MVP;"
"void main() {"
" gl_Position = MVP * vec4(pos, 1.0);"
" color = in_color;"
"}";
const char* fragment_shader =
"#version 410\n"
"in vec3 color;"
"out vec4 frag_color;"
"void main() {"
" frag_color = vec4(color, 1.0);"
"}";
GLuint shader = getShader(vertex_shader, fragment_shader);
GLuint MVPID = glGetUniformLocation(shader, "MVP");
//START MAKE MATRIX
glm::mat4 projection = glm::perspective(45.0, 4.0 / 3.0, 0.1, 100.0);
glm::mat4 view = glm::lookAt(glm::vec3(4.0, 3.0, -3.0), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
glm::mat4 MVP = projection * view;
//END MAKE MATRIX
glUniformMatrix4fv(MVPID, 1, GL_FALSE, &MVP[0][0]);
while (!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) {
//START DRAW
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, vertices);
//END DRAW
glfwPollEvents();
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
The problem is not with setupGLFW(), setupApple(), setupGLEW(), or getShader(). 问题不在于setupGLFW(),setupApple(),setupGLEW()或getShader()。 Those have been tested and proven to work. 这些已经过测试并证明可以工作。 The problem lies somewhere else, but I cannot figure out where. 问题出在其他地方,但我不知道在哪里。
If you move your glUniformMatrix4fv() call in update loop just after glUseProgram(theProgram) call code should work (just worked at my PC). 如果在glUseProgram(theProgram)调用代码应该可以正常工作之后才在更新循环中移动glUniformMatrix4fv()调用(仅在我的PC上有效)。
Also you could move glUseProgram(theProgram) and glUniformMatrix4fv() out of render loop so they won't be executed each frame. 另外,您可以将glUseProgram(theProgram)和glUniformMatrix4fv()移出渲染循环,这样就不会在每一帧都执行它们。
If you don't want to update your uniforms every glUseProgram, take a look at Uniform Buffer Object ( related thread on SO ). 如果您不想每次glUseProgram都更新制服,请查看Uniform Buffer Object ( SO上的相关线程 )。 You can share Uniform Buffer Objects between shader programs and update them on demand. 您可以在着色器程序之间共享统一缓冲区对象,并根据需要更新它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.