gpt4 book ai didi

c++ - OpenGL 3/GLFW 空白视口(viewport)

转载 作者:太空宇宙 更新时间:2023-11-04 11:04:48 26 4
gpt4 key购买 nike

我正在阅读 http://www.open.gl 上的第二个“章节”并遇到了我无法弄清楚的绘图问题。

int main()
{
//Initialize GLFW, create the window and the context
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(1024, 768, "Open.GL Drawing 1", nullptr, nullptr);

glfwMakeContextCurrent(window);

//initialize GLEW after context creation
glewExperimental = GL_TRUE;
glewInit();

//loading, compiling, and checking shaders takes place here
[...]

//create, link, and use the shader program
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);

//create and bind the vao for the position data
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

//triangle vertecies
GLfloat verticies[] = {
0.0f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f
};

//vbo for verticies
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);

//link, define, and enable the position attribute (aka, the verticies)
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(posAttrib);

//main loop!
while(!glfwWindowShouldClose(window))
{
glfwPollEvents();

if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glDrawArrays(GL_TRIANGLES, 0, 3);

glfwSwapBuffers(window);
}

//clean up after yourself
glfwTerminate();

glDeleteProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

glDeleteBuffers(1, &vbo);
glDeleteVertexArrays(1, &vao);

return EXIT_SUCCESS;
}

顶点着色器:

#version 150

in vec2 position;

void main()
{
gl_Position = vec4(position, 0.0, 1.0);
}

片段着色器:

#version 150

out vec4 outColor;

void mian()
{
outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

编译时

g++ -fdiagnostics-color -Wall -Wextra -std=c++11 -lGLEW -lGLU -lGL  -lglfw -o drawing1 drawing1.cpp

我没有收到任何警告,但程序运行时出现空白屏幕。我检查了 example code他链接以及github copy的例子来源。不幸的是,他使用 SFML 而我使用 GLFW,所以我试图弥补这种差异。

我尽力模仿他的示例代码(事物的排序等)以及添加 main() 和主循环的最后几行(没有提到删除着色器或清除教程中的视口(viewport)颜色,但这些语句出现在他的示例代码中)但仍然得到相同的结果。检查 glGetError() 给了我一个无效的枚举错误,但是 this post表示这可能是 glewExperimental 的预期行为。

在那之后,我不确定如何进一步隔离问题。我期待有人指出明显是一个简单的错误。 =)

最佳答案

作为Joey Dewd指出,我没有很好地阅读我的着色器代码。作为记录,是我在片段着色器中键入 mian 而不是 main 导致了问题。根据他的建议,我添加了代码来检查链接中的错误(我已经在检查编译错误),果然,当我重新创建我的拼写错误时,链接器提示了。

Fragment info
-------------
(0) : error C3001: no program defined

谢谢乔伊。 =)

关于c++ - OpenGL 3/GLFW 空白视口(viewport),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25714407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com