当谈到 3D 动画时,有很多我不熟悉的术语和概念(也许附加到这个问题的第二个问题:有哪些好书可以熟悉这些概念?)。我不知道“UV”是什么(在 3D 渲染的上下文中),也不熟悉用于将图像上的像素映射到网格上的点的工具。
我有一个 360 度相机生成的以下图像(它实际上是 HTMLvideo
元素的输出):
我希望该图像的中心是球体的“顶部”,并且该图像中圆的任何半径都是沿着球体从上到下的弧。
这是我的起点(直接从 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) 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) 问题:
我有一个模型的镜面/光泽度纹理图像,该图像尚未被 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) 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 …
如何以编程方式获取金属的最大纹理尺寸(宽度和高度)?使用 openGL 我可以做到:glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)
但是如何使用 Metal 做到这一点?
我正在使用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) 我目前正在开发一个关于面部跟踪并将面部导出到 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) 我正在开发一个项目,我需要使用纹理数组来应用纹理。我问了很多关于这个的问题,但没有一个得到我完全满意的答案(访问更高版本的 GLSL、OpenGL:在 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 中的对象?
如有必要,我很乐意提供任何其他信息。
我在我的应用程序中使用 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)也可以正常工作。 …