作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个1080x1920像素的纹理。我正在尝试使用长宽比不同的MTKView
渲染它。 (即iPad / iPhone X全屏)。
这就是我渲染MTKView
的纹理的方式:
private func render(_ texture: MTLTexture, withCommandBuffer commandBuffer: MTLCommandBuffer, device: MTLDevice) {
guard let currentRenderPassDescriptor = metalView?.currentRenderPassDescriptor,
let currentDrawable = metalView?.currentDrawable,
let renderPipelineState = renderPipelineState,
let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: currentRenderPassDescriptor) else {
semaphore.signal()
return
}
encoder.pushDebugGroup("RenderFrame")
encoder.setRenderPipelineState(renderPipelineState)
encoder.setFragmentTexture(texture, index: 0)
encoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4, instanceCount: 1)
encoder.popDebugGroup()
encoder.endEncoding()
// Called after the command buffer is scheduled
commandBuffer.addScheduledHandler { [weak self] _ in
guard let strongSelf = self else {
return
}
strongSelf.didRender(texture: texture)
strongSelf.semaphore.signal()
}
commandBuffer.present(currentDrawable)
commandBuffer.commit()
}
.scaleAspectFill
上像
UIView
一样呈现,并且我正在尝试学习
Metal
,所以我不确定应该在哪里寻找(
.metal
文件,管道,视图本身,编码器等)。 )
#include <metal_stdlib> using namespace metal;
typedef struct {
float4 renderedCoordinate [[position]];
float2 textureCoordinate; } TextureMappingVertex;
vertex TextureMappingVertex mapTexture(unsigned int vertex_id [[ vertex_id ]]) {
float4x4 renderedCoordinates = float4x4(float4( -1.0, -1.0, 0.0, 1.0 ),
float4( 1.0, -1.0, 0.0, 1.0 ),
float4( -1.0, 1.0, 0.0, 1.0 ),
float4( 1.0, 1.0, 0.0, 1.0 ));
float4x2 textureCoordinates = float4x2(float2( 0.0, 1.0 ),
float2( 1.0, 1.0 ),
float2( 0.0, 0.0 ),
float2( 1.0, 0.0 ));
TextureMappingVertex outVertex;
outVertex.renderedCoordinate = renderedCoordinates[vertex_id];
outVertex.textureCoordinate = textureCoordinates[vertex_id];
return outVertex; }
fragment half4 displayTexture(TextureMappingVertex mappingVertex [[ stage_in ]],texture2d<float, access::sample> texture [[ texture(0) ]]) {
constexpr sampler s(address::clamp_to_edge, filter::linear);
return half4(texture.sample(s, mappingVertex.textureCoordinate));
}
最佳答案
在处理“金属”纹理或“金属”时,通常要从以下几件事开始:
renderPassDescriptor
中来自行完成。但是您现在不需要关心这一点。您应该关心的唯一事情是要在您的解析纹理(可能具有不同的宽高比)中呈现的解析纹理中1080x1920像素纹理的内容,位置和部分。我们要完全填充(“scaleAspectFill”)解析纹理,因此我们将renderedCoordinates
保留在片段着色器中。在整个解析纹理上定义一个矩形,这意味着将为解析纹理中的每个像素调用片段着色器。接下来,我们将简单地更改纹理坐标。 ratio = width / height
,将解析纹理定义为r_tex
,将要渲染的纹理定义为tex
。 y
值不变。纹理坐标的x
值将被更改:x_left = 0 + ((tex.width - r_tex.width) / 2.0)
x_right = tex_width - ((tex.width - r_tex_width) / 2.0)
x_left = x_left / tex.width
x_right = x_right / tex.width
topLeft = float2(x_left,0)
topRight = float2(x_right,0)
bottomLeft = float2(x_left,1)
bottomRight = float2(x_right,1)
y
坐标scaleAspectFill
一样剪切纹理的一部分。请注意,上述解决方案未经测试。但我希望它会有所帮助。请确保不时访问
Metal Best Practices文档,这对正确理解基本概念很有帮助。玩金属吧!
关于ios - 在MTKView上渲染MTLTexture不能保持宽高比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48064936/
我将我的用户图片作为文件保存在我的硬盘上。(不在数据库中)。 我将获取此 *.jpg 文件的高度和宽度,该怎么做? (背景:我必须计算高度和宽度之间的比率以使其达到指定的高度和宽度而不拉伸(stret
我是一名优秀的程序员,十分优秀!