C++ Can';t使用OpenGL创建彩色三角形
我正在跟随open.gl,我已经到达了渲染阶段,但是我的三角形没有出现在屏幕上。只有一个黑盒子 我使用的是Win7,最新的驱动程序和一切,VS2013 为了方便起见,我将代码放在这里:C++ Can';t使用OpenGL创建彩色三角形,c++,opengl,graphics,C++,Opengl,Graphics,我正在跟随open.gl,我已经到达了渲染阶段,但是我的三角形没有出现在屏幕上。只有一个黑盒子 我使用的是Win7,最新的驱动程序和一切,VS2013 为了方便起见,我将代码放在这里: #define GLEW_STATIC #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream> using namespace std; int main() { glfwInit();
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
int main() {
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 vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
const char* vertexShaderCode =
"#version 150\n"
"in vec2 position;"
"void main() {"
" gl_Position = vec4(position, 0.0, 1.0);"
"}";
const char* fragmentShaderCode =
"#version 150\n"
"out vec4 outColor;"
"void main() {"
" outColor = vec4(1.0, 1.0, 1.0, 1.0);"
"}";
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderCode, NULL);
glCompileShader(vertexShader);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderCode, NULL);
glCompileShader(fragmentShader);
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(posAttrib);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
glfwSwapBuffers(window);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
glfwTerminate();
}
#定义GLEW#U静态
#包括
#包括
#包括
使用名称空间std;
int main(){
glfwInit();
glfwWindowHint(GLFW_上下文_版本_专业,3);
glfwWindowHint(GLFW_上下文_版本_小调,2);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
glfwWindowHint(GLFW_可调整大小,GL_为FALSE);
GLFWwindow*window=glfwCreateWindow(800600,“OpenGL”,nullptr,nullptr);
glfwMakeContextCurrent(窗口);
glewExperimental=GL_TRUE;
glewInit();
浮动顶点[]={
0.0f,0.5f,
0.5f,-0.5f,
-0.5f,-0.5f
};
GLuint vbo;
glGenBuffers(1,&vbo);
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
常量字符*vertexShaderCode=
“#版本150\n”
“处于vec2位置;”
“void main(){”
“gl_位置=向量4(位置,0.0,1.0);”
"}";
常量字符*fragmentShaderCode=
“#版本150\n”
“out vec4 OUTCLOR;”
“void main(){”
outColor=vec4(1.0,1.0,1.0,1.0)
"}";
GLuint vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1和vertexShaderCode,NULL);
glCompileShader(顶点着色器);
GLuint fragmentShader=glCreateShader(GL\u fragmentShader);
glShaderSource(fragmentShader,1和fragmentShaderCode,NULL);
glCompileShader(fragmentShader);
GLuint shaderProgram=glCreateProgram();
glAttachShader(着色器程序、顶点着色器);
glAttachShader(着色器程序、碎片着色器);
glBindFragDataLocation(着色器程序,0,“outColor”);
GLLINK程序(着色器程序);
glUseProgram(shaderProgram);
GLint posAttrib=glGetAttribLocation(着色器程序,“位置”);
glvertexattributepointer(posAttrib,2,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(posAttrib);
GLuint-vao;
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
而(!glfwWindowShouldClose(window)){
glfwPollEvents();
glfwSwapBuffers(窗口);
gldrawArray(GL_三角形,0,3);
}
glfwTerminate();
}
检查所有glFw命令是否失败。要进行调试,请在每个OpenGL命令后检查glGetError。还要确保着色器已正确编译,如果未正确编译,请确保打印错误消息
最后,检查视口。在指定顶点布局之前绑定VAO:
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
谢谢!教程没有提到这一点。