OpenGL纹理上下颠倒翻转的三种解决办法(转)

综述

在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL要求纹理坐标原点在图片最下面,如图: 
 

而图片信息中的原点一般都在最上方,一行行记录下来的,就会导致整个图片上下颠倒了。 
如图: 

 

从这个思路触发共有三种办法解决问题:

一.翻转顶点信息中的纹理坐标

原始顶点如图: 

 

 
因为纹理坐标的范围是0-1,所以翻转的话都统一用1去减 


得到正确的图片: 

 

二.翻转顶点Shader中的纹理坐标

基于方法一,更聪明的办法就是直接在Shader中翻转纹理Y轴坐标 


三.翻转顶点

上面都是直接针对问题的解决办法,反其道而行之,我们也可以直接翻转顶点,这样纹理就正了: 


 
在翻转顶点时,就不是直接对Y值用1去减,因为顶点的取值范围是-1 - 1 ,所以我们直接加上负号做翻转即可

这篇总结,参考了一个很好的OPENGL学习网站 
https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/, 
大力推荐

 

转载于:https://www.cnblogs.com/bokeofzp/p/5967512.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在OpenGL中实现纹理的左右上下翻转,可以使用以下两种方法: 1. 在着色器中对纹理坐标进行翻转 可以在着色器中对纹理坐标进行翻转,从而实现纹理的左右上下翻转。具体来说,可以将纹理坐标的y轴坐标取,将x轴坐标减去0.5后再乘以-1,即可实现左右翻转。将y轴坐标减去0.5后再乘以-1,即可实现上下翻转。以下是一个简单的示例代码: ```glsl #version 330 core out vec4 FragColor; in vec2 TexCoord; uniform sampler2D texture1; void main() { vec2 flipped_texcoord = vec2(TexCoord.x - 0.5, 0.5 - TexCoord.y); FragColor = texture(texture1, flipped_texcoord); } ``` 2. 在加载纹理时对像素数据进行翻转 可以在加载纹理时对像素数据进行翻转,从而实现纹理的左右上下翻转。具体来说,可以使用OpenGL提供的glPixelStorei函数,将GL_UNPACK_FLIP_Y_WEBGL参数设置为GL_TRUE,即可实现上下翻转。将GL_UNPACK_FLIP_Y_WEBGL参数设置为GL_FALSE,即可取消上下翻转。以下是一个简单的示例代码: ```cpp // 加载纹理 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; stbi_set_flip_vertically_on_load(true); // 上下翻转 unsigned char *data = stbi_load("texture.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); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值