Opengl备忘4---Texture
来源:互联网 发布:宿州智慧云计算产业园 编辑:程序博客网 时间:2024/05/02 00:54
(1)纹理坐标:
使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0,0)也就是纹理图片的左下角,终结于纹理图片的右上角(1,1)。
GLfloat texCoords[] = { 0.0f,0.0f,// 左下角
1.0f,0.0f,// 右下角
0.5f,1.0f// 顶部位置
};
2:
纹理环绕方式(Texture Wrapping)
GL_REPEAT
一样,除了重复的图片是镜像放置的GL_CLAMP_TO_EDGE纹理坐标会在0到1之间,超出的部分会重复纹理坐标的边缘,就是边缘被拉伸GL_CLAMP_TO_BORDER超出的部分是用户指定的边缘的颜色glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
如果我们选择GL_CLAMP_TO_BORDER
选项,我们还要指定一个边缘的颜色。这次使用glTexParameter
函数的fv
后缀形式,加上GL_TEXTURE_BORDER_COLOR
作为选项,这个函数需要我们传递一个边缘颜色的float数GL_NEAREST
和GL_LINEAR
。组作为颜色值:
float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
3纹理过滤(Texture Filtering)
GL_NEAREST
和GL_LINEAR
。4;
多级渐远纹理(Mipmaps)
glGenerateMipmaps过滤方式 描述
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
常见的错误是,为多级渐远纹理过滤选项设置放大过滤。这样没有任何效果,因为多级渐远纹理主要使用在纹理被缩小的情况下的:纹理放大不会使用多级渐远纹理,为多级渐远纹理设置放大过滤选项会产生一个GL_INVALID_ENUM
错误。
5:
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
- 第一个参数指定纹理目标(环境);设置为
GL_TEXTURE_2D
意味着会生成与当前绑定的纹理对象在同一个目标(Target)上的纹理(任何绑定到GL_TEXTURE_1D
和GL_TEXTURE_3D
的纹理不会受到影响)。 - 第二个参数为我们打算创建的纹理指定多级渐远纹理的层级,如果你希望单独手工设置每个多级渐远纹理的层级的话。这里我们填0基本级。
- 第三个参数告诉OpenGL,我们希望把纹理储存为何种格式。我们的图像只有RGB值,因此我们把纹理储存为
GL_RGB
值。 - 第四个和第五个参数设置最终的纹理的宽度和高度。我们加载图像的时候提前储存它们这样我们就能使用相应变量了。 下个参数应该一直被设为
0
(遗留问题)。 - 第七第八个参数定义了源图的格式和数据类型。我们使用RGB值加载这个图像,并把它们储存在char(byte),我们将会传入相应值。
- 最后一个参数是真实的图像数据。
6: 应用纹理
GLfloat vertices[] = {
// ---- 位置 ---- ---- 颜色 ---- ---- 纹理坐标 ----
0.5f,0.5f,0.0f,1.0f,0.0f,0.0f,1.0f,1.0f,// 右上
0.5f, -0.5f,0.0f,0.0f,1.0f,0.0f,1.0f,0.0f,// 右下
-0.5f, -0.5f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,// 左下
-0.5f,0.5f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f// 左上};
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glUniform1i(glGetUniformLocation(ourShader.Program,"ourTexture1"),0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
glUniform1i(glGetUniformLocation(ourShader.Program,"ourTexture2"),1);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_IN, 0);
glBindVertexArray(0);
使用Soil或者Freeimage加载图像倒立 由于opengl要求y轴0,0 在左下角,图片y的00
在左上角
解决方式:
- 我们切换顶点数据的纹理坐标,翻转
y
值(用1减去y坐标)。 - 我们可以编辑顶点着色器来翻转
y
坐标,自动替换TexCoord
赋值:TexCoord = vec2(texCoord.x, 1 - texCoord.y);
- Opengl备忘4---Texture
- openGL CG 系列教程4 - Lighting + Texture
- OpenGL ES texture fonts
- Skia OpenGL Texture Helloworld
- opengl texture map
- OpenGL: Render to Texture
- jpeg转换OpenGL Texture
- png转换OpenGL Texture
- openGL CG4 - Lighting + Texture
- OpenGL 练习12 texture
- OpenGL Texture 纹理
- OpenGL 中的 Render To Texture
- openGL中的Texture/MultiTexture Mapping
- openGL ES 2.0 笔记 texture
- Android OpenGL ES->Compressed Texture
- ffmpeg video to opengl texture
- OpenGL’s texture coordinate system
- OpenGL texture黑边问题
- iOS数据库离线缓存思路和网络层封装——数据缓存机制Model封装
- jQuery事件(ready/bind/hover/toggle/unbind/one/trigger/focus/blur/change/live)
- 为什么毕业三四年之后,同学之间的差距会这么大?
- 练习二1015
- 23.Java IO: Serializable && StreamTokenizer
- Opengl备忘4---Texture
- 奇怪的lib形式
- iOS数据库离线缓存思路和网络层封装——网络请求基类封装
- MATLAB中plot()画图的颜色线型参数设置
- SCI论文及期刊查询
- 十年研发经验工程师的嵌入式学习书籍大推荐
- The patch E:\android-sdk-windows does not belong to a directory.Android studio will use this Andriod
- CF 41A Translation
- 入门TrafficServer插件开发的正确姿势