openGl3
注意
- rendererLoop中,glUniform4f前必须先glUseProgram才能生效。原文:更新一个uniform之前你必须先使用程序(调用glUseProgram),因为它是在当前激活的着色器程序中设置uniform的
- 偏移可以直接写产量诶, glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void )(3sizeof(float)));
- 顶点只有3个,但是颜色却是插值了的。因为所有片段着色器的输入变量都会插值。原文:光栅会根据每个片段在三角形形状上所处相对位置决定这些片段的位置。基于这些位置,它会插值(Interpolate)所有片段着色器的输入变量。
练习
修改顶点着色器让三角形上下颠倒,改成-y就行
位置偏移,本来是x+一点即可,但注意,没有vec1类型,至少也是vec2,vec1直接写float
为什么在三角形的左下角是黑的。因为颜色<=0的时候是黑的
---进入下一章,纹理
从上一章,可以知道,可以对每个点定义颜色,实现很真实的效果。但这样显然,点更多了。所以用一张图,选几个点,然后订在图形上
如果我们把纹理坐标设置在范围之外,默认会重复图像,几种可能的例图:
mipmap,一般不在纹理过小,需要对纹理放大的时候用。mipMap生成的都是小于原图的,会报错。原文:为放大过滤设置多级渐远纹理的选项会产生一个GL_INVALID_ENUM错误代码。
一个png图片,是怎么变成GPU里能显示的数据的呢。png、jpg这些格式在日常显示中随便找个软件就能开png图片,ktx就不一样了。原文提到2个处理纹理的步骤,加载、创建。png、jpg、webp等格式,都是一些二进制,但数据结构和排列不同,所以每支持一种,就要写一个图像加载器,把图像转化为字节序列。
原中用的stb_image.h。读取图片数据和glBindTexture是分开的,也就是说,图片data通过stb_image读,这个调用位置随意,但是注意gl指令得InitGlad后,2个库只是可以合作而已,本质是分开的,逻辑步骤是关联的
uniform,不是之前的用的glbind的话,多个texture怎么绑定。用的这个:glActiveTexture(GL_TEXTURE0);。只不过texture0是默认active的,所以单个texture可以直接绑
- 文中提到图片翻转的问题。原文:“这是因为OpenGL要求y轴0.0坐标是在图片的底部的,但是图片的y轴0.0坐标通常在顶部。”怎么理解,是png、jpg这种格式的y00在顶部
总结:解析纹理为二进制数据->从二进制数据生成texture->从顶点shader传入纹理坐标数据->在片段shader对颜色取texture的颜色
练习
- 意外的是,设置纹理的环绕方式,保持原样的是左下角的。想来也是,毕竟00在左下角,之前猜在左上角主观了。
![]()
- 纹理坐标居然可以直接从0.4开始,也就是说,图片本身是按照0-1,有个坐标,我们在顶点shader传入的坐标,只是在这个坐标中去取一部分。例子见这个练习:尝试在矩形上只显示纹理图像的中间一部分,修改纹理坐标,达到能看见单个的像素的效果。尝试使用GL_NEAREST的纹理过滤方式让像素显示得更清晰
- 这个练习:使用一个uniform变量作为mix函数的第三个参数来改变两个纹理可见度,使用上和下键来改变箱子或笑脸的可见度。我把按下变化设置为了0.1,导致变化过快 。所以这个press检测是只要按下就走到,不记录抬起放下按键


浙公网安备 33010602011771号