OpenGL程序不显示任何图片
Posted
技术标签:
【中文标题】OpenGL程序不显示任何图片【英文标题】:OpenGL program doesn't show any picture 【发布时间】:2017-04-30 13:22:08 【问题描述】:我尝试显示一个简单的三角形,但屏幕上什么也没有。
我可以清除颜色,但没有别的。 (我把所有东西都放在一个大文件里)。 我正在使用 SDL 创建窗口。其他一切都应该只是 OpenGL。
这是我的代码:
int main()
// Init window
SDL_Init(SDL_INIT_EVERYTHING);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_Window* window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(m_window);
GLenum status = glewInit();
if(status != GLEW_OK)
std::cerr << "Glew failed!" << std::endl;
isClosed = false;
// Init everything else
GLuint vaoID;
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
GLuint vboID;
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
GLfloat vert2[] = -1,-1,0, 1,-1,0, 0,0,0;
glBufferData(GL_ARRAY_BUFFER, sizeof(vert2), vert2, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
GLuint frag = glCreateShader(GL_FRAGMENT_SHADER);
GLuint vert = glCreateShader(GL_VERTEX_SHADER);
std::string sFrag = "#version 130 \n out vec4 out_color; \n void main(void)out_color = vec4(1, 0, 1, 1);";
std::string sVert = "#version 130 \n in vec3 pos; \n void main(void)gl_Position = vec4(pos, 1);";
char const* cFrag = sFrag.c_str();
char const* cVert = sVert.c_str();
GLint success = 0;
glShaderSource(frag, 1, &cFrag, NULL);
glCompileShader(frag);
glGetShaderiv(frag, GL_COMPILE_STATUS, &success);
if(success == GL_FALSE) std::cerr << "Möb" << std::endl;
else std::cout << "YES" << std::endl;
glShaderSource(vert, 1, &cVert, NULL);
glCompileShader(vert);
glGetShaderiv(vert, GL_COMPILE_STATUS, &success);
if(success == GL_FALSE) std::cerr << "Möb" << std::endl;
else std::cout << "YES" << std::endl;
GLuint program = glCreateProgram();
glAttachShader(program, vert);
glAttachShader(program, frag);
glBindAttribLocation(program, 0, "pos");
glDeleteShader(vert);
glDeleteShader(frag);
glLinkProgram(program);
//glValidateProgram(program);
while(!isClosed)
glUseProgram(program);
glBindVertexArray(vaoID);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
glUseProgram(0);
// Update
SDL_GL_SwapWindow(window);
SDL_Event e;
while(SDL_PollEvent(&e))
if(e.type == SDL_QUIT)
isClosed = true;
glClearColor(0, 1, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
return 0;
【问题讨论】:
您的代码存在一些问题,但它们都不需要解释问题。 1:您没有指定 GL 版本和配置文件,但您使用的是#version 330 core
着色器。根据您使用的 GL 实现,这将或不会起作用。 2. 您尝试绘制 4 个顶点,但缓冲区中只有 3 个。 3. 你从不检查你的程序的链接状态。 4. 你根本不检查任何 GL 错误。
@derhass:不要忘记一个完全缺席的glewInit()
电话。
我只是忘记复制了
【参考方案1】:
您在display.update()
之前调用glClear()
,这似乎表明您在交换它之前清除后台缓冲区。假设其他代码是正确的,如果你交换glClear()
和display.update()
的位置,你可能会看到一些东西。
【讨论】:
谢谢,这对我来说很有意义。但是我换了之后,结果还是一样。 可能值得用您使用什么库来创建 GL 上下文以及您是否将代码基于示例来更新问题。 (某些库要求您显式设置扩展。)接下来我要检查的是它是否正在创建深度缓冲区。如果是这种情况,您应该将 glClear() 更改为 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 我认为,我已经正确设置了有关 SDL 的所有内容,并且如您所见,我添加了GL_DEPTH_BUFFER_BIT
。但我仍然得到相同的结果。以上是关于OpenGL程序不显示任何图片的主要内容,如果未能解决你的问题,请参考以下文章