我试图显示一个简单的三角形,但屏幕上没有任何内容。
我可以清除颜色,但没有别的。 (我把所有东西放在一个大文件中)。 我正在使用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;
}
答案 0 :(得分:2)
您在glClear()
之前调用了display.update()
,这似乎表明您在交换缓冲区之前正在清除后台缓冲区。其他代码是正确的,如果您交换glClear()
和display.update()
的位置,您可能会看到一些内容。