Qt3D中网格尺寸变化时如何保持纹理纵横比
我正在测试Qt3D的当前状态。我非常喜欢MetalRoughMaterial,但我似乎无法在Qt3D中处理这个简单的用例:我想使用重复的纹理来填充它们所在的面 预期结果: 我得到的是(见下面的代码): 在你想知道的情况下,我做了2个立方体在另一个旁边做第二个图像,但是我不认为这是一个真正的解决方案……) 我一直在尝试WrapMode、Qtexture、textureScale,但还没有在Qt3D中找到解决方案 我注意到,当我更改textureScale时,会在所有面上重复纹理。但是在小脸上,我们得到的图像数量与长脸上的图像数量相同。有没有办法改变x,y和z的值 代码: 我知道如何在纯opengl(没有Qt3D)中通过改变顶点数据的纹理坐标来实现这一点。如果这是一个方向,我怀疑我将不得不使我自己的自定义网格。有人能证实这是一条路吗?或者这个用例还有其他解决方案吗Qt3D中网格尺寸变化时如何保持纹理纵横比,qt,opengl,qml,qt5,qt3d,Qt,Opengl,Qml,Qt5,Qt3d,我正在测试Qt3D的当前状态。我非常喜欢MetalRoughMaterial,但我似乎无法在Qt3D中处理这个简单的用例:我想使用重复的纹理来填充它们所在的面 预期结果: 我得到的是(见下面的代码): 在你想知道的情况下,我做了2个立方体在另一个旁边做第二个图像,但是我不认为这是一个真正的解决方案……) 我一直在尝试WrapMode、Qtexture、textureScale,但还没有在Qt3D中找到解决方案 我注意到,当我更改textureScale时,会在所有面上重复纹理。但是在小脸上
谢谢你花时间阅读这篇文章。欢迎提供任何帮助和建议,即使是纯opengl解决方案。是的,您可以在几何体中更改纹理坐标,但我认为编写自定义着色器更容易,它可以从计算中获得正确的纹理坐标。例如,可以从SimpleMaterial着色器开始,修改它以显示所需的栅格。我有类似的片段着色器代码:
#version 150 core
uniform vec3 boxSize;//all model
uniform vec2 wallSectionSize;//x y - size of cell inside this model
varying highp vec3 pos;
void main() {
vec3 pt = pos.xyz;
float x = pt.x;
float y = pt.y;
float z = pt.z;
bool side = false;
if(x==0 || x==boxSize.x) {
x = z;
side = true;
} else if(y==0 || y==boxSize.y) {
y = z;
}
//b == block number
const int nbx = int(x/wallSectionSize.x);
const int nby = int(y/wallSectionSize.y);//floor number from 0
//coordinates in this block umber
float bx = x - nbx * wallSectionSize.x;
float by = y - nby * wallSectionSize.y;
if(nbx % 2)
//fragColor = texture2D(...);
fragColor = vec4(1,1,0,0);
else
fragColor = vec4(1,0,1,0);
}
此外,如果立方体在所有方向上的增长相等,则可以使用
textureScale
属性。在您的示例中,如果立方体的比例不相等,则可以使用textureTransform
matrix。我还创建了一个使用两种方法和着色器的示例:
非常感谢!您是否有一个小的可编译示例,说明如何在具有长方体的Qt3D中使用它?或指向使用自定义着色器的示例的任何链接?这看起来很有前途,我想玩它。不麻烦。。。我想我找到了我需要的东西:技术和效果图。再次感谢康斯坦丁。谢谢你的努力,康斯坦丁!遗憾的是,textureTransform不能像使用TextureMaterial(看起来很枯燥)一样使用MetalRoughMaterial。那里没有纹理属性。也许有一个解决方法…我认为最简单的方法是克隆
MetalRoughMaterial
着色器,然后重新实现textureTransform
,就像在TextureMaterial
中所做的那样。我担心你会这么说。再次感谢这不是一项困难的任务-只需在着色器中添加一个以上的参数,并在其中相乘即可。如果您看到,有m_textureTransformParameter(新的QParameter(QStringLiteral(“texCoordTransform”)、qVariantFromValue(QMatrix3x3()))
,然后->您将看到如何使用texCoordTransform
。
#version 150 core
uniform vec3 boxSize;//all model
uniform vec2 wallSectionSize;//x y - size of cell inside this model
varying highp vec3 pos;
void main() {
vec3 pt = pos.xyz;
float x = pt.x;
float y = pt.y;
float z = pt.z;
bool side = false;
if(x==0 || x==boxSize.x) {
x = z;
side = true;
} else if(y==0 || y==boxSize.y) {
y = z;
}
//b == block number
const int nbx = int(x/wallSectionSize.x);
const int nby = int(y/wallSectionSize.y);//floor number from 0
//coordinates in this block umber
float bx = x - nbx * wallSectionSize.x;
float by = y - nby * wallSectionSize.y;
if(nbx % 2)
//fragColor = texture2D(...);
fragColor = vec4(1,1,0,0);
else
fragColor = vec4(1,0,1,0);
}