用glew,glfw实现opengl绘制3D学习笔记1-实现一个窗口

这篇文章是根据这个教程http://bullteacher.com/4-hello-window.html实现的代码,在我的vs2012和windows10上运行成功


#define GLEW_STATIC
#include<GL/glew.h>
#include<iostream>


#define GLFW_INCLUDE_GLU
#include<GLFW/glfw3.h>
using namespace std;
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
int main(void)
{ //------实例化窗口-------
    glfwInit();//初始化
<span style="white-space:pre">	</span>glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置选项设置主版本为opengl3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本为3
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//告诉GLFW使用core-profile
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//用户不能调窗口的大小
<span style="white-space:pre">	</span>//----创建一个窗口的对象----
<span style="white-space:pre">	</span>GLFWwindow * window = glfwCreateWindow(800, 600, "LearnOpenGL",nullptr, nullptr);
<span style="white-space:pre">	</span>//第一个参数是宽度,第二个事长度,第三个是窗口的名称,后面两个参数可以忽略,函数返回一个GLFWWindow对象


if (window == NULL)
{
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);//告诉GLFW创建窗口环境,这个环境是当前线程的主环境
//注册回调函数
 glfwSetKeyCallback(window, key_callback);
 //希望在调用任何OpenGL函数前初始化GLEW。
 glewExperimental = GL_TRUE;
 /*
 注意,在初始化GLEW前我们把glewExperimental变量设置为GL_TRUE。设置glewExperimental为true可以保证GLEW使用更多的现代技术来管理OpenGL机能。如果不这么设置,它就会使用默认的GL_FALSE,
 这样当使用core profile的时有可能发生问题。
 */
if(glewInit() != GLEW_OK)
{
    std::cout << "Failed to initialize GLEW" << std::endl;
    return -1;
}
//在我们在开始渲染前,我们必须做最后一件事。我们必须告诉opengl渲染窗口大小
//前两个参数是左下角起始位置,后面两个是渲染窗口的大小,它和GLFW窗口是一样大的。
//我们可以把这个值设置得比GLFW窗口尺寸小;这样OpenGL的渲染都会在一个更小的窗口(区域)进行显示,我们可以在OpenGL的viewport之外显示其他的元素。
glViewport(0, 0, 800, 600);
/*
OpenGL幕后是使用特定的数据的,通过glViewport把这种2D坐标加工为屏幕上的坐标。比如,一个被加工的点的位置是(-0.5, 0.5)会
(作为它最后的变换)被映射到屏幕坐标(200, 450)上。注意,OpenGL中处理的坐标是在-1和1之间,所以我们事实上是把(-1到1)
*/
/*
我们不希望应用绘制了一个图像之后立即退出,然后关闭窗口。我们想让应用持续绘制
图像,监听用户输入直到软件被明确告知停止,为了达到目的我们必须建立一个while循环
,现在我们调用游戏循环(game loop),这样,我们告诉GLFW停止之前应用就会一直保持运行状态


*/
while(!glfwWindowShouldClose(window))
{//glfwWindowShouldClose函数从开始便检验每一次循环迭代中gLFW是否已经得到关闭指示,如果得到这样的指示,函数就会返回true,
<span style="white-space:pre">	</span>//并且游戏循环停止运行,之后我们就可以关闭应用了。
 glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
    glfwPollEvents();//检验是否有任务被触发了,(比如鼠标移动和键盘的输入事件),接着
<span style="white-space:pre">	</span>//调用相应的函数(我们可以通过回调方法设置他们)。我们经常在循环迭代事件中处理函数


    glfwSwapBuffers(window);//函数会交换颜色缓冲(颜色缓冲是一个GLFW窗口为每一个像素存储的颜色数值的最大缓冲)
<span style="white-space:pre">	</span>//它是这迭代中绘制的,也作为输出到显示在屏幕上
}
 glfwTerminate();//释放所有的资源
    return 0;
       
}
//key_calllback回调函数,它在用户使用键盘的时候被调用。
/*按键输入函数的接收一个GLFWwindow参数,一个代表按下按键的整型数字,
一个特定动作,按钮是被按下、还是释放,一个代表某个标识的整数告诉你shift、control、alt或super是否被同时按下。每当一个用户按下一个按钮,
GLFW都会调用这个函数,为你的这个函数填充合适的参数。*/


void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
    std::cout << key << std::endl;
<span style="white-space:pre">	</span>//当用户按下esc,我们就把windowShouldClose设置为ture,关闭应用
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}
运行结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用glfw开发一个3d场景的基本步骤: 1. 初始化glfw库 在程序开始时,需要初始化glfw库,以便使用glfw的各项功能。 ```c++ if (!glfwInit()) { // 初始化glfw失败 exit(EXIT_FAILURE); } ``` 2. 创建窗口 创建一个窗口,并设置窗口的大小、标题等属性。 ```c++ GLFWwindow* window = glfwCreateWindow(800, 600, "My 3D Scene", NULL, NULL); if (!window) { // 创建窗口失败 glfwTerminate(); exit(EXIT_FAILURE); } ``` 3. 设置当前上下文 将当前上下文设置为窗口的上下文,以便后续的OpenGL渲染操作。 ```c++ glfwMakeContextCurrent(window); ``` 4. 初始化GLEWGLEW一个用于管理OpenGL扩展的库,需要在程序中先进行初始化。 ```c++ if (glewInit() != GLEW_OK) { // 初始化glew失败 glfwTerminate(); exit(EXIT_FAILURE); } ``` 5. 加载shader 加载顶点着色器和片元着色器,并将它们编译成shader程序。 ```c++ GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); ``` 6. 创建图形对象 创建一个3D立方体的顶点数据,以便后续渲染。 ```c++ GLfloat vertices[] = { // 前面 -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, // 后面 -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, // 上面 -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, // 下面 -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, // 左面 -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, // 右面 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, }; GLuint indices[] = { 0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20 }; GLuint VAO, VBO, EBO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glGenBuffers(1, &EBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); glBindVertexArray(0); ``` 7. 渲染场景 将shader程序绑定到OpenGL上下文中,并渲染上面创建的图形对象。 ```c++ while (!glfwWindowShouldClose(window)) { // 清空颜色缓冲区 glClear(GL_COLOR_BUFFER_BIT); // 使用shader程序 glUseProgram(shaderProgram); // 设置模型、视图、投影矩阵 glm::mat4 model = glm::mat4(1.0f); glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)800 / (float)600, 0.1f, 100.0f); GLuint modelLoc = glGetUniformLocation(shaderProgram, "model"); GLuint viewLoc = glGetUniformLocation(shaderProgram, "view"); GLuint projectionLoc = glGetUniformLocation(shaderProgram, "projection"); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection)); // 渲染图形 glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); glBindVertexArray(0); // 交换缓冲区 glfwSwapBuffers(window); glfwPollEvents(); } ``` 这样,一个基本的使用glfw开发的3d场景就完成了。当然,还有很多其他的细节和调整可以进行,比如光照、纹理等,可以根据实际需求进行进一步的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值