gpt4 book ai didi

opengl - 像素完美的纹理映射与现代 OpenGL

转载 作者:行者123 更新时间:2023-12-04 15:03:51 27 4
gpt4 key购买 nike

在决定尝试在现代 OpenGL 中编程后,我已经放弃了固定功能管道,我不完全确定是否可以获得与以前相同的功能。

我正在尝试使用像素完美大小的纹理贴图四边形,匹配纹理大小。例如,一个 128x128 的纹理映射到一个大小为 128x128 的四边形。

这是我的顶点着色器。

#version 110
uniform float xpos;
uniform float ypos;
uniform float tw; // texture width in pixels
uniform float th; // texture height in pixels
attribute vec4 position;
varying vec2 texcoord;
void main()
{
mat4 projectionMatrix = mat4( 2.0/600.0, 0.0, 0.0, -1.0,
0.0, 2.0/800.0, 0.0, -1.0,
0.0, 0.0, -1.0, 0.0,
0.0, 0.0, 0.0, 1.0);

gl_Position = position * projectionMatrix;
texcoord = (gl_Position.xy);
}

这是我的片段着色器:

#version 110
uniform float fade_factor;
uniform sampler2D textures[1];
varying vec2 texcoord;

void main()
{
gl_FragColor = texture2D(textures[0], texcoord);
}

我的顶点数据就是这样,其中 w 和 h 是纹理的宽度和高度。

[
0, 0,
w, 0,
w, h,
0, h
]

我加载了一个 128x128 的纹理,使用这些着色器,我看到图像重复了 4 次:http://i.stack.imgur.com/UY7Ts.jpg

考虑到 tw th、xpos、xpos 制服,任何人都可以提供有关能够翻译和缩放的正确方法的建议吗?

最佳答案

这有一个问题:

mat4 projectionMatrix = mat4( 2.0/600.0, 0.0, 0.0, -1.0,
0.0, 2.0/800.0, 0.0, -1.0,
0.0, 0.0, -1.0, 0.0,
0.0, 0.0, 0.0, 1.0);

gl_Position = position * projectionMatrix;

Transformation matices 是右结合的,即你应该乘以相反的顺序。此外,您通常不会在着色器中指定投影矩阵,而是将其作为统一传递。 OpenGL 为您提供了随时可用的用于投影和模型 View 的制服。在 OpenGL-3 核心中,您可以重用统一名称以保持兼容。
// predefined by OpenGL version < 3 core:
#if __VERSION__ < 400
uniform mat4 gl_ProjectionMatrix;
uniform mat4 gl_ModelviewMatrx;
uniform mat4 gl_ModelviewProjectionMatrix; // premultiplied gl_ProjectionMatrix * gl_ModelviewMatrix
uniform mat4 gl_ModelviewInverseTranspose; // needed for transformin normals

attribute vec4 gl_Vertex;

varying vec4 gl_TexCoord[];
#endif

void main()
{
gl_Position = gl_ModelviewProjectionMatrix * gl_Vertex;
}

接下来你必须明白纹理坐标不处理纹理像素(纹素),但纹理应该被理解为具有给定采样点的插值函数;纹理坐标 0 或 1 不会击中纹素的中心,而是正好位于环绕之间,因此变得模糊。只要您的四边形屏幕尺寸与纹理尺寸完全匹配,就可以了。但是,一旦您只想显示一个子图像,事情就会变得有趣(我将其作为练习留给读者来找出确切的映射;提示:您将拥有术语 0.5/dimension 和 (dimension - 1)/dimension在解决方案中)

关于opengl - 像素完美的纹理映射与现代 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com