【发布时间】:2021-01-18 01:04:01
【问题描述】:
我学习 OpenGL,下面是我用 SFML + GLEW 编写的简单代码片段(一切正常):
const char *vertexShaderSource =
"#version 330 core\n"
"layout (location = 0) in vec3 pos;\n"
//"uniform vec2 offset = vec2(0.0f, 0.0f);\n";
"uniform vec4 OurColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n"
"out vec4 ourColor;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(pos.x + 0.0f, pos.y + 0.0f, pos.z, 1.0);\n"
"ourColor = OurColor;\n"
"}\0";
const char *fragmentShaderSource =
"#version 330 core\n"
"out vec4 color;\n"
"in vec4 ourColor;\n"
"void main()\n"
"{\n"
" color = ourColor;\n"
"}\0";
// --------------------------------------
GLfloat vertices[] = {
-0.5f, 1.0f, 0.0f,
0.5f, 1.0f, 0.5f,
0.0f, 0.0f, 0.0f,
-0.5f, -1.0f, -0.5f,
0.5f, -1.0f, 1.0f,
};
GLuint indices[] = {
0, 1, 2,
2, 3, 4
};
GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
GLuint EBO;
glGenBuffers(1, &EBO);
glBindBuffer(
GL_ELEMENT_ARRAY_BUFFER,
EBO
);
glBufferData(
GL_ELEMENT_ARRAY_BUFFER,
sizeof(indices),
indices,
GL_STATIC_DRAW
);
// create buffer
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// copy vertices to buffer
glBufferData(
GL_ARRAY_BUFFER,
sizeof(vertices),
vertices,
GL_STATIC_DRAW
);
// --------------------------------------
GLuint vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(
vertexShader,
1,
&vertexShaderSource,
nullptr
);
glCompileShader(vertexShader);
GLint success;
GLchar infoLog[512];
glGetShaderiv(
vertexShader,
GL_COMPILE_STATUS,
&success
);
if (!success) {
glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
std::cerr << "Vertex shader compilation error: " << infoLog << "\n";
std::cin.get();
return EXIT_FAILURE;
}
// --------------------------------------
GLuint fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(
fragmentShader,
1,
&fragmentShaderSource,
nullptr
);
glCompileShader(fragmentShader);
glGetShaderiv(
fragmentShader,
GL_COMPILE_STATUS,
&success
);
if (!success) {
glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
std::cerr << "Fragment shader compilation error: " << infoLog << "\n";
std::cin.get();
return EXIT_FAILURE;
}
// --------------------------------------
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glGetShaderiv(
shaderProgram,
GL_LINK_STATUS,
&success
);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
std::cerr << "Shader link error: " << infoLog << "\n";
std::cin.get();
return EXIT_FAILURE;
}
// --------------------------------------
glUseProgram(shaderProgram);
glEnableVertexAttribArray(0);
glVertexAttribPointer(
0,
3,
GL_FLOAT,
GL_FALSE,
3 * sizeof(GL_FLOAT),
(GLvoid*)0
);
// --------------------------------------
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
bool running = true;
sf::Clock clock;
while (running) {
sf::Event windowEvent;
while (window.pollEvent(windowEvent)) {
switch (windowEvent.type) {
case sf::Event::Closed: running = false; break;
}
}
float greenValue = std::sin(clock.getElapsedTime().asSeconds()) / 2.0 + 0.5f;
// ---------------- OpenGL here ---------------
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear( GL_COLOR_BUFFER_BIT );
GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "OurColor");
//GLint vertexMovementLocation = glGetUniformLocation(shaderProgram, "offset");
glUseProgram(shaderProgram);
glUniform4f(vertexColorLocation, 0.f, greenValue, 0.f, 1.f);
//glUniform2f(vertexMovementLocation, 0.5f, 1.f);
glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
// --------------------------------------------
window.display();
}
结果如我所料:
问题在于顶点着色器,当我取消注释行时:
uniform vec2 offset = vec2(0.0f, 0.0f);\n
我明白了:
我什至不在任何地方使用奥菲斯特制服。我不知道发生了什么,当我再向顶点着色器添加一个统一时,没有任何工作正常...我没有收到任何着色器编译错误。
提前感谢您的帮助!
【问题讨论】:
标签: opengl