Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt3D中网格尺寸变化时如何保持纹理纵横比_Qt_Opengl_Qml_Qt5_Qt3d - Fatal编程技术网

Qt3D中网格尺寸变化时如何保持纹理纵横比

Qt3D中网格尺寸变化时如何保持纹理纵横比,qt,opengl,qml,qt5,qt3d,Qt,Opengl,Qml,Qt5,Qt3d,我正在测试Qt3D的当前状态。我非常喜欢MetalRoughMaterial,但我似乎无法在Qt3D中处理这个简单的用例:我想使用重复的纹理来填充它们所在的面 预期结果: 我得到的是(见下面的代码): 在你想知道的情况下,我做了2个立方体在另一个旁边做第二个图像,但是我不认为这是一个真正的解决方案……) 我一直在尝试WrapMode、Qtexture、textureScale,但还没有在Qt3D中找到解决方案 我注意到,当我更改textureScale时,会在所有面上重复纹理。但是在小脸上

我正在测试Qt3D的当前状态。我非常喜欢MetalRoughMaterial,但我似乎无法在Qt3D中处理这个简单的用例:我想使用重复的纹理来填充它们所在的面

预期结果:

我得到的是(见下面的代码):

在你想知道的情况下,我做了2个立方体在另一个旁边做第二个图像,但是我不认为这是一个真正的解决方案……)

我一直在尝试WrapMode、Qtexture、textureScale,但还没有在Qt3D中找到解决方案

我注意到,当我更改textureScale时,会在所有面上重复纹理。但是在小脸上,我们得到的图像数量与长脸上的图像数量相同。有没有办法改变x,y和z的值

代码:

我知道如何在纯opengl(没有Qt3D)中通过改变顶点数据的纹理坐标来实现这一点。如果这是一个方向,我怀疑我将不得不使我自己的自定义网格。有人能证实这是一条路吗?或者这个用例还有其他解决方案吗


谢谢你花时间阅读这篇文章。欢迎提供任何帮助和建议,即使是纯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);
}