这是学习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);
}

最新文章

  1. 移动端关于meta的几个常用标签
  2. vi命令大全
  3. 解决html中&amp;nbsp;在不同浏览器中占位大小不统一的问题
  4. 【UML】如何看Android的UML图
  5. js post提交页面
  6. DbHelperSQL和Dapper数据访问的性能对比
  7. laravel homestead
  8. 『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息
  9. 12个非常有用的JavaScript小技巧
  10. 3 x 8 = 23(火了)
  11. Facebook 在page添加自己开发的app
  12. JVM 参数设置
  13. Angular2 Service实践
  14. ACM Bone Collector
  15. ELK---日志分析系统
  16. gitlab 存储仓库目录设置及数据迁移
  17. Windows-universal-samples学习笔记系列四:Data
  18. XML学习(1)
  19. JS之replace
  20. 784. Letter Case Permutation 字符串中字母的大小写组合

热门文章

  1. 8-剑指offer: 替换空格
  2. python27期day18:模块和包、作业。
  3. maven介绍(一)
  4. 团队冲刺---Four
  5. [知识点]最近公共祖先LCA
  6. 【ECNU3386】Hunter&#39;s Apprentice(多边形有向面积)
  7. Ubuntu放弃战斗, Linux桌面的悲哀 - 简书
  8. 一键脚本解决Windows系统更新错误(0x80070003)
  9. 【微信小程序】 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded
  10. nacos服务注册与发现及服务配置实现