OpenGL 总结以下坐标系统之前

迄今为止,2D平面就已经差不多OK了。为了更好的学习3D,总结一些需要注意的小细节或者是小套路。

首先,还是要多写代码,好多东西都是记住的

  • 使用glfw那一套一定要熟练哦~

    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);
    if (window == NULL) {
        std::cout << "window init error" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glewExperimental = true;
    
    if (glewInit() != GLEW_OK) {
        std::cout << "glew init error" << std::endl;
        glfwTerminate();
        return -1;
    }
    glViewport(0, 0, 800, 600);
    while (!glfwWindowShouldClose(window)) {
        pressInput(window);
    
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
  • 起码开个窗口不能有问题。

要深刻理解VAO,VBO,EBO之间的关系

  • VAO叫顶点数据对象,里面有一个Array Buffer和一个Element Buffer
  • VBO缓冲到Array Buffer,EBO缓冲到Element Buffer
  • 这三种对象的初始化一定要会。

着色器编译连接那一套,理解的基础上,自己封装一个完整的Shader类。可以复用哦~

自己封装哒~

着色器(GLSL)一定要自己写,个人觉得这个是OpenGL的精髓,重点是理解uniform这个东西(相当于全局变量)

#version version_number
in type in_variable_name;
in type in_variable_name;

out type out_variable_name;

uniform type uniform_name;

int main()
{
  // 处理输入并进行一些图形操作
  ...
  // 输出处理过的结果到输出变量
  out_variable_name = weird_stuff_we_processed;
}

纹理(Texture)记住下面的步骤应该没问题

//创建纹理
unsigned int texture;
glGenTextures(1, &texture);
//绑定纹理
glBindTexture(GL_TEXTURE_2D,texture);
//设置环绕和过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);   
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//加载并生成纹理
int width, height, nrChannels;
unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
if (data){
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else{
    std::cout << "Failed to load texture" << std::endl;
}
//释放图像内存
stbi_image_free(data);
  • 纹理坐标是储存到顶点数据中的,所以要对应更改VertexShader和顶点数据的读取方式

纹理单元

  • 应用与多个纹理同时渲染的情况
  • 使用时记得先激活再绑定

矩阵变换 和 GLM

已经很精简了

猜你喜欢

转载自www.cnblogs.com/LittleBanana/p/11902179.html