LearnOpenGL笔记(2)三角形
2024-09-01 07:13:55
这是学习LearnOpenGL CN教程的笔记,包括我遇到的问题和我的烂笔头。文章名与网站小节对应。
------------------------------------分割线--------------------------------------------------------------------------------------------
摆张重要的图先,蓝色的是可以编写着色器控制的部分。
着色器在C++字符串中的形式
"#version 330 core\n" "layout (location = 0) in vec3 aPos;\n" "void main()\n" "{\n" "gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n" "}\n";
绘制流程
//初始化缓冲数组对象
unsigned int VAO; //顶点数组对象VAO
unsigned int VBO; //顶点缓冲对象VBO
//创建VAO
glGenVertexArrays(, &VAO);
//绑定VAO
glBindVertexArray(VAO); //创建VBO
glGenBuffers(, &VBO); //生成vbo和缓冲ID
//缓冲绑定
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//将数据传输到当前绑定缓冲
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//第四个参数:如何管理给定的数据
// GL_STATIC_DRAW :数据不会或几乎不会改变。
// GL_DYNAMIC_DRAW:数据会被改变很多。
// GL_STREAM_DRAW :数据每次绘制时都会改变。 //解析顶点数据,设置顶点属性指针
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(float), (void*));
glEnableVertexAttribArray();
//创建着色器程序
//顶点着色器
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
//附加
glShaderSource(vertexShader, , &vertexShaderSource, NULL);
//编译
glCompileShader(vertexShader);
//检测失败
int success;
char infoLog[];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertexShader, , NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}
//片段着色器
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, , &fragmentShaderSource, NULL);
glCompileShader(fragmentShader); //片段着色器
unsigned int fragmentShaderY;
fragmentShaderY = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderY, , &fragmentShaderYellowSource, NULL);
glCompileShader(fragmentShaderY); shaderProgram = glCreateProgram();
//附加
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
//链接
glLinkProgram(shaderProgram);
shaderYellowProram = glCreateProgram();
//附加
glAttachShader(shaderYellowProram, vertexShader);
glAttachShader(shaderYellowProram, fragmentShaderY);
//链接
glLinkProgram(shaderYellowProram);
//链接成功后,释放着色器对象
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glDeleteShader(fragmentShaderY);
//在循环渲染中绘制
//渲染循环
while (!glfwWindowShouldClose(window)) {
//渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, , ); //交换颜色缓冲,绘制显示
glfwSwapBuffers(window);
}
最新文章
- 移动端关于meta的几个常用标签
- vi命令大全
- 解决html中&;nbsp;在不同浏览器中占位大小不统一的问题
- 【UML】如何看Android的UML图
- js post提交页面
- DbHelperSQL和Dapper数据访问的性能对比
- laravel homestead
- 『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息
- 12个非常有用的JavaScript小技巧
- 3 x 8 = 23(火了)
- Facebook 在page添加自己开发的app
- JVM 参数设置
- Angular2 Service实践
- ACM Bone Collector
- ELK---日志分析系统
- gitlab 存储仓库目录设置及数据迁移
- Windows-universal-samples学习笔记系列四:Data
- XML学习(1)
- JS之replace
- 784. Letter Case Permutation 字符串中字母的大小写组合