C++ 将2D纹理缩放到模型缩放以防止拉伸
我有一个OpenGL 3.3程序,其中有不同的对象,例如一个简单的立方体。立方体的尺寸为1x1x1(顶点从-0.5、-0.5、-0.5到0.5、0.5、0.5),并且在每侧使用一个2D纹理进行纹理处理。纹理是可重复的(无缝的) 使用我的实际代码,模型缩放如下所示(忽略实际纹理): 这样缩放之后:C++ 将2D纹理缩放到模型缩放以防止拉伸,c++,opengl,C++,Opengl,我有一个OpenGL 3.3程序,其中有不同的对象,例如一个简单的立方体。立方体的尺寸为1x1x1(顶点从-0.5、-0.5、-0.5到0.5、0.5、0.5),并且在每侧使用一个2D纹理进行纹理处理。纹理是可重复的(无缝的) 使用我的实际代码,模型缩放如下所示(忽略实际纹理): 这样缩放之后: out vec4 FragColor; in vec2 TexCoord; // texture samplers uniform sampler2D texture_diffuse1; unif
out vec4 FragColor;
in vec2 TexCoord;
// texture samplers
uniform sampler2D texture_diffuse1;
uniform vec4 color;
void main()
{
FragColor = color + texture(texture_diffuse1, TexCoord);
}
在这种情况下,中的纹理应保持z方向的大小,但在z轴上重复 有没有一种好方法可以根据模型的缩放正确缩放纹理以防止其拉伸?还是必须创建3D纹理 我发现的问题是,在我的着色器中,我只得到立方体的(缩放)点,例如-0.5,-1,5,-0.5,但纹理的坐标仅为2D(0.0,0.0),我不知道必须缩放纹理的哪一侧,因为我不知道它当前将在哪一侧渲染 但是,为完整起见,顶点着色器代码:
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoord;
out vec2 TexCoord;
out vec3 FragPos;
out vec3 Normal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
FragPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal;
TexCoord = aTexCoord;
gl_Position = projection * view * model * vec4(aPos, 1.0);
//gl_Position = projection * view * model * vec4(aPos, 1.0f);
//TexCoord = aTexCoord;
}
片段着色器如下所示:
out vec4 FragColor;
in vec2 TexCoord;
// texture samplers
uniform sampler2D texture_diffuse1;
uniform vec4 color;
void main()
{
FragColor = color + texture(texture_diffuse1, TexCoord);
}
你想让它看起来像什么?如果比例不是整数呢?不确定你的意思,拉伸是实际的比例,没有办法。也许你可以让木框架不标度,只标内部的正方形。这将需要您增加多边形数并仅拉伸内部正方形,这样帧将只会变得更长而不是更厚。在这种情况下,中的纹理应保持z方向的大小,但在z轴上重复。这可能不起作用,但如果将比例矩阵传递给vertexshader,开始时应该是identity,然后执行如下操作:
vec4 texCoord4=scaleMatrix*vec4(TexCoord,0,1)
TexCoord=vec2(texCoord4)`您可能还需要一个glTexParameteri(GL_纹理2D,GL_纹理包裹,GL_重复)代码>如果在z轴上缩放,它将不起作用,但只要稍加修改,您就可以完成您想要的maybe@DraykoonD我已经想到了这个选项,但是你怎么说它不适用于z轴。你希望它看起来像什么?如果比例不是整数呢?不确定你的意思,拉伸是实际的比例,没有办法。也许你可以让木框架不标度,只标内部的正方形。这将需要您增加多边形数并仅拉伸内部正方形,这样帧将只会变得更长而不是更厚。在这种情况下,中的纹理应保持z方向的大小,但在z轴上重复。这可能不起作用,但如果将比例矩阵传递给vertexshader,开始时应该是identity,然后执行如下操作:vec4 texCoord4=scaleMatrix*vec4(TexCoord,0,1)
TexCoord=vec2(texCoord4)`您可能还需要一个glTexParameteri(GL_纹理2D,GL_纹理包裹,GL_重复)代码>如果在z轴上缩放,它将不起作用,但只要稍加修改,您就可以完成您想要的maybe@DraykoonD我已经想到了这个选项,但是你怎么说它不适用于z轴。