标签: textures

在 ThreeJS 中将立体投影映射到球体内部

当谈到 3D 动画时,有很多不熟悉的术语和概念(也许附加到这个问题的第二个问题:有哪些好书可以熟悉这些概念?)。我不知道“UV”是什么(在 3D 渲染的上下文中),也不熟悉用于将图像上的像素映射到网格上的点的工具。

我有一个 360 度相机生成的以下图像(它实际上是 HTMLvideo元素的输出):

360度全景

我希望该图像的中心是球体的“顶部”,并且该图像中圆的任何半径都是沿着球体从上到下的弧。

这是我的起点(直接从 Three.JS 文档复制代码行):

var video = document.getElementById( "texture-video" );

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

var texture = new THREE.VideoTexture( video );
texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;
texture.format = THREE.RGBFormat;

var material = new THREE.MeshBasicMaterial( { map: texture } );

var geometry …
Run Code Online (Sandbox Code Playgroud)

javascript 3d textures mesh three.js

5
推荐指数
1
解决办法
3303
查看次数

离屏渲染金属

 func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
        print("current drawable size:\(view.drawableSize)")
    }

    func draw(in view: MTKView) {


        guard let drawable = view.currentDrawable else { return }

        let textureDescriptor = MTLTextureDescriptor()
        textureDescriptor.textureType = MTLTextureType.type2D
        textureDescriptor.width = drawable.texture.width
        textureDescriptor.height = drawable.texture.height
        textureDescriptor.pixelFormat = .bgra8Unorm
        textureDescriptor.storageMode = .shared
        textureDescriptor.usage = .renderTarget

        let sampleTexture = device.makeTexture(descriptor: textureDescriptor)


        let renderPass = MTLRenderPassDescriptor()
        renderPass.colorAttachments[0].texture = sampleTexture
        renderPass.colorAttachments[0].loadAction = .clear
        renderPass.colorAttachments[0].clearColor =
            MTLClearColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
        renderPass.colorAttachments[0].storeAction = .store

        let commandBuffer = commandQueue.makeCommandBuffer() …
Run Code Online (Sandbox Code Playgroud)

textures ios swift metal metalkit

5
推荐指数
1
解决办法
2331
查看次数

如何向 GLTF 模型添加光泽度/镜面反射纹理?

问题:

我有一个模型的镜面/光泽度纹理图像,该图像尚未被 GLTF 模型使用。

如何使用/添加纹理到我的模型中,使其在应有的位置具有反光/光泽?

我不知道要在 .gltf 文件中更改什么才能使用纹理。

编辑:添加了更多 GLTF 行以更好地了解情况。


GLTF JSON:

"images": [
    {
        "name": "...",
        "uri": "..."
    },
    {
        "name": "...",
        "uri": "..."
    },
    {
        "name": "...",
        "uri": "..."
    },
    {
        "name": "...",
        "uri": "..."
    },
    {
        "name": "...",
        "uri": "..."
    }
],
"samplers": [
    {}
],
"textures": [
    {
        "name": "T_N",
        "sampler": 0,
        "source": 0
    },
    {
        "name": "Map #9",
        "sampler": 0,
        "source": 1
    },
    {
        "name": "T_D",
        "sampler": 0,
        "source": 2
    },
    {
        "name": …
Run Code Online (Sandbox Code Playgroud)

javascript json textures three.js gltf

5
推荐指数
1
解决办法
2454
查看次数

如何使用 SDL2 纹理作为更新画布?

I am trying to create a dynamic plotter in SDL2 for an embedded project. Currently, the code executes on both architectures, x86, and ARM. On x86 I get a smooth running plotter, however, on ARM it runs very slow at a fraction of the frames I get on x86. I am pretty sure this is because I rerender every pixel on the surface at this is a massive overheat on the embedded device.

I tried rendering the new content to …

c++ textures sdl sdl-2

5
推荐指数
1
解决办法
3538
查看次数

如何以编程方式获取最大纹理尺寸(宽度和高度)

如何以编程方式获取金属的最大纹理尺寸(宽度和高度)?使用 openGL 我可以做到:glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)但是如何使用 Metal 做到这一点?

textures ios swift metal metalkit

5
推荐指数
2
解决办法
3266
查看次数

有没有一种方法可以在不使用暂存缓冲区的情况下更新纹理?

我正在使用https://vulkan-tutorial.com/深度缓冲代码作为基础。进行了一些更改以每帧更新命令缓冲区。

我正在使用一种粗略的方法来检查 fps。不确定它到底有多准确,但我正在对 fps 使用此检查。

            static auto startTime = std::chrono::high_resolution_clock::now();

            auto currentTime = std::chrono::high_resolution_clock::now();
            float time = std::chrono::duration<float, std::chrono::seconds::period>(currentTime - startTime).count();

            if (time < 1)
            {
                counter++;
            }
            else
            {
                int a = 34; //breakpoint put here to check the counter fps.
            }
Run Code Online (Sandbox Code Playgroud)

任何没有每帧纹理的方式(命令缓冲区仍在每帧更新。) fps 约为 3500 fps。如果我尝试更新每帧的纹理,fps 会下降到 350 fps。

这只是带有空白纹理的测试代码,但这是我第一次使用上传纹理并更新它的过程。

void createTextureImage()
{
    int Width = 1024;
    int Height = 1024;

    VkDeviceSize imageSize = Width * Height * sizeof(Pixel);
    PixelImage.resize(Width * Height, Pixel(0xFF, 0x00, 0x00));

    VkBuffer …
Run Code Online (Sandbox Code Playgroud)

c++ textures game-engine vulkan

5
推荐指数
1
解决办法
1199
查看次数

使用 .obj 文件导出纹理

我目前正在开发一个关于面部跟踪并将面部导出到 obj 文件的项目。我成功导出它,但无法导出纹理文件。我正在分享导出文件的代码,可能我遗漏了一些东西,请帮助我。当我调用该函数时,newMesh!.generateLightMapTexture它会使代码崩溃并给出以下日志:

Removed 41721 bad triangles
Can't choose for edge creation
Can't choose for edge creation
Can't choose for edge creation
Can't choose for edge creation
Can't choose for edge creation
Can't choose for edge creation
Can't choose for edge creation
Can't choose for edge creation ...
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: unordered_map::at: key not found
Run Code Online (Sandbox Code Playgroud)

下面我分享一下导出的代码:

func exportFile() {
    let geometry = currentFaceAnchor.geometry
    let allocator = MDLMeshBufferDataAllocator()

    let vertices = allocator.newBuffer(with: Data(fromArray: geometry.vertices), …
Run Code Online (Sandbox Code Playgroud)

textures swift arkit

5
推荐指数
1
解决办法
803
查看次数

OpenGL 中的纹理数组

我正在开发一个项目,我需要使用纹理数组来应用纹理。我问了很多关于这个的问题,但没有一个得到我完全满意的答案(访问更高版本的 GLSLOpenGL:在 GLSL 中访问数组纹理OpenGL:如何实现纹理数组?)所以我我正在问一个更广泛的问题,希望得到答复。无论如何,我将如何在 OpenGL 中对对象进行纹理处理(更具体地说是 PyOpenGL,但如果你将答案放在 C++ 中,那就没问题了)。我已经有一种加载纹理数组的方法,只是没有应用它的方法。这是期望的结果:

例子

图片来自opengl-tutorial

这就是我目前用于加载数组纹理的内容:

def load_texture_array(path,width,height):
    teximg = pygame.image.load(path)
    texels = teximg.get_buffer().raw
    texture = GLuint(0)

    layerCount = 6
    mipLevelCount = 1

    glGenTextures(1, texture)
    glBindTexture(GL_TEXTURE_2D_ARRAY, texture)
    glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA8, width, height, layerCount)
    glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_UNSIGNED_BYTE, texels)

    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
Run Code Online (Sandbox Code Playgroud)

TLDR:如何使用纹理数组将纹理应用于 OpenGL 中的对象?

如有必要,我很乐意提供任何其他信息。

python opengl textures pygame pyopengl

5
推荐指数
1
解决办法
6066
查看次数

使用大画布时 JavaFX 中的 NullPointers

我在我的应用程序中使用 Canvas 对象,确切地说,是 StackPane 中两个大小相同的对象。当这些对象变大时,JavaFX 在尝试绘制/渲染时开始崩溃:

java.lang.NullPointerException: Cannot invoke "com.sun.prism.RTTexture.createGraphics()" because "<local9>" is null
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(NGCanvas.java:214)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.initCanvas(NGCanvas.java:644)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:607)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
(...)
Run Code Online (Sandbox Code Playgroud)

和类似的(都与javafx.graphics/com.sun.javafx.sg.prism.NGCanvas相关)。现在,过去已经有一些关于类似内容的讨论(例如这里),一半的互联网基本上只是通过关闭硬件加速来回答这个问题,这就是标志所做-Dprism.order=sw的。

我认为这不是答案。

我的图形硬件支持 16384x16384 纹理(至少在 OpenGL 驱动程序中)和 8GB VRAM。我什至写了一个小测试程序来验证是否是“真正的”支持,并且有效,因为我过去曾被一些糟糕的集成笔记本电脑的图形设备烧伤,该设备声称支持此兼容 OpenGL-v3,但实际上是这样的。当有人尝试分配 8k+ 纹理时崩溃。我的 PC 中只有一张显卡,因此 JavaFX 应用程序不可能使用错误的设备。

当我将画布对象的大小从 4156x4156 调整为 8252x8252 时,我的应用程序崩溃了。即使我们接受它将使用下一个更高的二次方尺寸来渲染这些东西,我也声称我的硬件应该能够处理这个设置。即使多个 16384x16384 纹理也可以轻松地与其他内容一起装入内存。

我使用的是 Windows 10,使用版本 15.0.1 的 OpenJDK 和 JavaFX,尽管 Canvas 很旧,这不应该是问题。

有谁知道这里到底发生了什么?

编辑:正如评论中所建议的,我做了一些更精确的测试。使用两个画布对象的硬编码尺寸进行进一步的手动测试揭示了以下内容:

将两者设置为 4096x4096 和 4097x4097 都有效。请记住,后者应在内部使用 8192x8192 纹理,因为这就是显卡的工作原理。内部是指在显卡上,而不是其他任何地方。

然而,这里变得有趣了:

将两个画布对象之一设置为 8192x8192(并将另一个保留为 2x2)也可以正常工作。 …

java graphics textures javafx nullpointerexception

5
推荐指数
1
解决办法
1782
查看次数

有没有办法在 Bevy 中创建“渲染纹理”?

我想使用Bevy创建类似门户的效果。Unity 似乎有一个渲染纹理来实现这一点。

有没有办法在 Bevy 中做同样的事情?如果没有,未来是否有计划支持?

textures rendering bevy

5
推荐指数
1
解决办法
2244
查看次数