我的一個非常奇怪的問題是我的簡單的OpenGL應用程序沒有在我的女朋友的機器上工作。起初,我想到了我的代碼存在的各種問題,但是我最終可以將其分解爲這種代碼不工作(不工作意味着:三角形繪製正確,但是黑色,即沒有正確的顏色):glVertexAttrib3f在一臺機器上的奇怪行爲
#include <stdio.h>
#include <stdlib.h>
#include <string>
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtx/transform.hpp>
#include "../common/shader.h"
const GLfloat reticle_vertices[] =
{
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
glm::mat4 MVP;
glm::mat4 vp;
const char *vertexSource =
"#version 150\n"
"layout(location = 0) in vec3 position;"
"layout(location = 1) in vec3 color;"
"out vec3 fragColor;"
"uniform mat4 MVP;"
"void main() {"
"gl_Position = MVP * vec4(position, 1.0);"
"fragColor = color;"
"}";
const char *fragmentSource =
"#version 150\n"
"in vec3 fragColor;"
"out vec4 outColor;"
"void main() {"
"outColor = vec4(fragColor, 1.0);"
"}";
// Key callback: exit on ESCAPE
static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
// Initialize and return a window with GLFW
GLFWwindow *initGLWindow(int width, int height, int samples, const char *title, GLFWkeyfun keycb)
{
if (!glfwInit())
{
fprintf(stderr, "Failed to initialize GLFW\n");
return NULL;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_SAMPLES, samples);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow *w = glfwCreateWindow(width, height, title, NULL, NULL);
if (!w)
{
glfwTerminate();
return NULL;
}
glfwMakeContextCurrent(w);
glfwSetKeyCallback(w, keycb);
glewExperimental = true;
if (glewInit() != GLEW_OK)
{
fprintf(stderr, "Failed to initialize GLEW\n");
return NULL;
}
return w;
}
int main()
{
// Initialize the OpenGL window
GLFWwindow *window = initGLWindow(1024, 768, 2, "Schnuff", key_callback);
// Load and use the shaders
GLuint programID = LoadShaders(vertexSource, fragmentSource);
glUseProgram(programID);
// Get the attribute locations
GLuint posAttrib = glGetAttribLocation(programID, "position");
printf("posAttrib = %d\n", posAttrib);
GLuint colAttrib = glGetAttribLocation(programID, "color");
printf("colAttrib = %d\n", colAttrib);
//GLint normAttrib = glGetAttribLocation(programID, "normal");
//printf("normAttrib = %d\n", normAttrib);
GLuint mvpID = glGetUniformLocation(programID, "MVP");
// Vertex array object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Vertex buffer object
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(reticle_vertices), reticle_vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posAttrib);
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
// Hide the cursor
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
glClearColor(0.0f, 0.0f, 0.2f, 1.0f);
glm::mat4 m = glm::mat4(1.0f);
// Main loop
do
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUniformMatrix4fv(mvpID, 1, GL_FALSE, &m[0][0]);
glVertexAttrib3f(colAttrib, 1.0f, 0.0f, 0.0f);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
while (!glfwWindowShouldClose(window));
glDeleteProgram(programID);
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
至於我能弄清楚,只有是因爲以下的問題:她的機器,posAttrib = 1, colAttrib = 0
上,而在我的是倒過來。我嘗試使用
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
然後它工作正常!雖然曾經我交換這些數字(我還沒有與其他的價值觀和#version 330 core\n
進行測試,但她的筆記本電腦目前處於脫機狀態),它停止工作了......
我甚至發現下面沒有答案的問題here on SO,這似乎非常密切相關。
您有沒有人遇到類似的行爲,或知道如何解決整個情況,而無需使用layout(location = x)
?因爲我認爲在一個更大的項目中,手工設置每個位置可能是乏味的或不需要的(如果我錯了,糾正我,這實際上是實現這個目標的首選方法!)。
還沒有測試:大於0或1,#version
東西其他值,因爲我的機器上我甚至不能使用layout(location = x)
沒有#version 330 core
(這又是奇怪,因爲它顯然不她的機器上的東西這使其工作)。
我是OpenGL的新手,因此在這裏完全搞不懂! :-)
爲什麼它downvoted什麼建議嗎?如果您留下提示,我可以嘗試改進我的帖子:/ – InvisiblePanda
內嵌該代碼。糊狀蛋白有消失的習慣。 – genpfault