贴图问题,opengl,linux,windows,消除锯齿,摩尔纹,yuv 还是 rgb

1 消除锯齿和摩尔纹

windows下使用d3d是很方便的,基本不用设置很多东西,就可以做到,所以windows上最好使用d3d。但是linux上有所不同。

摩尔条纹是两条线或两个物体之间以恒定的角度和频率发生干涉的视觉结果,而锯齿是在缩小的情况下,画面计算引起,这两个事物都必须消除。

使用opengl 在linux 上做opengl 和 windows上有所不同吗,事实上,是这样的,我们在渲染的时候,如何做到反锯齿,反摩尔纹,其实都是要了解和掌握最基础的底层相应的知识体系,才能做到比较好的状态,监控贴图也是一个麻烦的事情,特别注意的是画面缩小的情况,如果我们熟悉ffmpeg,就知道ffmpeg在缩小算法上做得很好,可以消除很多锯齿和摩尔纹。
请看下面这幅图:正好是同向的方块和线条组成,这种情况锯齿更加严重。
没有反摩尔纹
这个很恶劣,主要是锯齿和摩尔效应对眼睛的刺激比较大,这样除了让普通的观察者感到无法接受,最重要的是图像会产生误差,下面使用mipmap去过滤图像

mipmap过滤图像
发现好了一点,并不是非常好
下面使用mipmap和各项异性过滤,会更好一点

在这里插入图片描述
使用linear 和mipmap 与各项异性过滤
在这里插入图片描述
达到效果!

linux 和windows的不同之处以及linux的问题

知识讲完,难道linux和windows下真的有所不同?那么答案在这里:代码是一样的,不一样的是驱动,linux下开源驱动,闭源驱动,opengl版本不同,还有半闭源驱动,以及nvidia下是否安装cuda,最终影响画面的总共有以下几点:
1 画面分辨率
2 如果是远程画面还有码率问题
3 opengl 版本
4 驱动
5 a卡的驱动和n卡驱动不同
6 cuda 问题
7 linux下bug问题(大都是国产操作系统,不言明了)

我举个例子,我们选取RGBA32 和RGB24 和 yuv420 去贴图的时候,应该选取哪一个?

这个问题比较麻烦,但不复杂,说亮点:
分辨率不同,选取RGB32 和 yuv 应该不同
驱动不同,选取RGB32 和 yuv 不同
opengl版本不同,选取不同,
显卡不同,选取不同
那么综合以上所述,应该选取哪一样比较合适,这个实际上要经过许多测试的,在windows上,不用担心这类问题,因为驱动肯定是合适的,接下去就是选取opengl 的版本,当然使用vulkan 是另外一回事,所以windows上我们可以这么做:

windows
小分辨率: 使用RGB32,为什么不使用RGB24,虽然RGB24的数据量更小,不过大部分显卡是为了游戏而生,所使用的颜色对齐一致为RGBA,所以反而效率要高
大分辨率:使用yuv420,数据量过了瓶颈,yuv420的数据量小很多,效率反而高了

linux :
不知道怎么做:选取RGB32, 放大缩小使用linear 过滤
知道怎么做: 选取两种方式,用户可以修改方式,放大缩小使用linear 和mipmap
知道自己使用的是纯的闭源驱动,是配置的专家,使用yuv420 和 硬件解码结合,使用linear 和mipmap过滤和各项异性过滤。

以上只是建议,肯定有更好的方式。

比如windows不使用opengl,使用direct3d是更好的,使用d3d11 就好了,如果有兴趣,当然可以使用dx12,考虑的是兼容问题,那就直接使用d3d。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
OpenGL ES中将YUV数据换为RGB格式需要进行以下步骤: 1. 创建一个理对象,用于存储换后的RGB数据。 2. 将YUV数据绑定到一个理单元上。 3. 创建一个着色器程序,用于将YUV数据换为RGB格式。 4. 将理对象绑定到FBO(Frame Buffer Object),并将着色器程序与FBO绑定。 5. 渲染FBO以将YUV数据换为RGB格式。 下面是一个简单的代码示例: 1. 创建理对象 ``` GLuint textureID; glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ``` 2. 绑定YUV数据到理单元 ``` glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, yData); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, width / 2, height / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, uvData); ``` 3. 创建着色器程序 ``` const char* vertexShader = "attribute vec4 position;\n" "attribute vec2 texCoord;\n" "varying vec2 v_texCoord;\n" "void main()\n" "{\n" " gl_Position = position;\n" " v_texCoord = texCoord;\n" "}\n"; const char* fragmentShader = "precision highp float;\n" "varying vec2 v_texCoord;\n" "uniform sampler2D yTexture;\n" "uniform sampler2D uvTexture;\n" "void main()\n" "{\n" " float y = texture2D(yTexture, v_texCoord).r;\n" " float u = texture2D(uvTexture, v_texCoord).r - 0.5;\n" " float v = texture2D(uvTexture, v_texCoord).a - 0.5;\n" " float r = y + 1.13983 * v;\n" " float g = y - 0.39465 * u - 0.58060 * v;\n" " float b = y + 2.03211 * u;\n" " gl_FragColor = vec4(r, g, b, 1.0);\n" "}\n"; GLuint programID = glCreateProgram(); GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShaderID, 1, &vertexShader, NULL); glCompileShader(vertexShaderID); glAttachShader(programID, vertexShaderID); GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShaderID, 1, &fragmentShader, NULL); glCompileShader(fragmentShaderID); glAttachShader(programID, fragmentShaderID); glLinkProgram(programID); glUseProgram(programID); ``` 4. 绑定理对象到FBO,并将着色器程序与FBO绑定 ``` GLuint fboID; glGenFramebuffers(1, &fboID); glBindFramebuffer(GL_FRAMEBUFFER, fboID); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0); glViewport(0, 0, width, height); glUseProgram(programID); glUniform1i(glGetUniformLocation(programID, "yTexture"), 0); glUniform1i(glGetUniformLocation(programID, "uvTexture"), 1); ``` 5. 渲染FBO ``` GLfloat vertices[] = { -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f }; GLubyte indices[] = {0, 1, 2, 3}; glVertexAttribPointer(glGetAttribLocation(programID, "position"), 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), vertices); glVertexAttribPointer(glGetAttribLocation(programID, "texCoord"), 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), vertices + 2); glEnableVertexAttribArray(glGetAttribLocation(programID, "position")); glEnableVertexAttribArray(glGetAttribLocation(programID, "texCoord")); glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, indices); glDisableVertexAttribArray(glGetAttribLocation(programID, "position")); glDisableVertexAttribArray(glGetAttribLocation(programID, "texCoord")); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值