即使没有发生错误,三角形也不会在屏幕openGL上绘制
Triangles not being drawn on screen openGL even when no error is occurred
我写了一个简单的openGL程序在屏幕上画一个三角形。我已经做了调试与glGetError(),现在没有错误的代码,但当我试图运行它只有一个黑屏出现。
是我的代码。我使用GLFW创建窗口。
#include<glew.h>
#include<glfw3.h>
#include<stdio.h>
int main(int argc, char ** argv)
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr);
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit();
float vertices[] = {
0.0f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f
};
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
const GLchar * vs =
"#version 150n"
"in vec2 position;n"
"void main() {n"
"vec4 gl_Position = vec4( position , 0.0 , 1.0 );n"
"}";
const GLchar * fs =
"#version 150n"
"out vec4 out_color; n"
"void main() { n"
"out_color = vec4(1.0, 1.0, 1.0, 1.0);n"
"}";
GLuint vsh = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vsh, 1, &vs, NULL);
glCompileShader(vsh);
GLint status;
glGetShaderiv(vsh, GL_COMPILE_STATUS, &status);
if (status == GL_TRUE) printf("Vertex Shader Compiled successn");
GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fsh, 1, &fs, NULL);
glCompileShader(fsh);
glGetShaderiv(fsh, GL_COMPILE_STATUS, &status);
if (status == GL_TRUE) printf("Fragment Shader Compiled successn");
GLuint sp = glCreateProgram();
glAttachShader(sp, vsh);
glAttachShader(sp, fsh);
glBindFragDataLocation(sp, 0, "out_color");
glBindAttribLocation(sp,1,"position");
glLinkProgram(sp);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glUseProgram(sp);
while (!glfwWindowShouldClose(window))
{
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
我已经把问题缩小到只有一行代码
GLint pos = glGetAttribLocation(sp, "position") //sp is shader program
问题是它返回-1。我在教程中读到,如果你不使用变量,它将被编译器优化出来。我在代码中使用了位置,那么为什么它被丢弃了。下面是我的顶点着色器
const GLchar * vs =
"#version 150n"
"in vec2 position;n"
"void main() {n"
"vec4 gl_Position = vec4( position , 0.0 , 1.0 );n"
"}";
只需在后面添加这些行glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray (0);glVertexAttribPointer(0,2, GL_FLOAT, GL_FALSE, 0,0);
我的意思是使用位置0而不是1希望对大家有所帮助
相关文章:
- OpenGL ES 2.0将纹理绘制到屏幕上是行不通的
- OpenGL - 添加第二个着色器属性会导致空白屏幕
- 如何使用 openGL 在屏幕上显示加载的纹理
- 如何在OpenGL中自动选择屏幕大小
- Qt,openGL,小部件和屏幕外渲染
- OpenGL屏幕坐标到世界坐标
- 当对象在屏幕空间中较小时,OpenGL 更新缓慢
- 如何使用OpenGL在屏幕上显示三角形
- OpenGL多个带有独特着色器的呼叫可提供空白屏幕
- OpenGL 检查屏幕边界
- OpenGL 屏幕外渲染
- OpenGL:MESA3D屏幕上的软件渲染性能问题
- 我试图运行OpenGL,但Glut屏幕只是呈现一个白色屏幕
- QT QML 中的 OpenGL,无法更新屏幕上的图像
- OpenGL在非方形屏幕上绘制线条
- OpenGL 3 Qt 渲染空白屏幕
- OpenGL使用glfw通过HIDDEN窗口进行屏幕外渲染和读取像素值
- OpenGL显示空白屏幕.可能是因为着色器
- 即使没有发生错误,三角形也不会在屏幕openGL上绘制
- 空白屏幕OpenGL