标签: rendering

Direct3D11(C++):渲染(基本)问题

我一直在关注一本关于 D3D11 游戏编程基础知识的书。我现在了解了 Direct3D 的绝对基础知识:)

但是...我有一个问题。在书中,我总是必须一次制作一个演示。现在,我正在尝试用它制作一个 2D 游戏。因为我不想养成坏习惯,所以我需要你的建议。

在书中,我总是必须定义一个(具有 texcoord 和位置成员的 struct VertexPos)或(仅具有 XMFLOAT3 位置成员的 struct VertexPos)。在我正在制作的游戏中,我希望能够绘制没有纹理的实体表面和有纹理的表面。我不知道如何做到这一点,更不用说有效地做到这一点了。

这是我的渲染函数:

void GameSpriteDemo::Render()
{
    if (m_pD3DContext == 0)
    {return;}

    float ClearColor[4] = {0.0f, 0.0f, 0.25f, 1.0f};
    m_pD3DContext->ClearRenderTargetView(m_pBackBufferTarget,ClearColor);

    UINT stride = sizeof(VertexPos);
    UINT offset = 0;

    m_pD3DContext->IASetInputLayout(m_pInputLayout);
    m_pD3DContext->IASetVertexBuffers(0,1,&m_pVertexBuffer, &stride, &offset);
    m_pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    m_pD3DContext->VSSetShader(m_pSolidColorVS,0,0);
    m_pD3DContext->PSSetShader(m_pSolidColorPS,0,0);
    m_pD3DContext->PSSetShaderResources(0,1,&m_pColorMap);
    m_pD3DContext->PSSetSamplers(0,1,&m_pColorMapSampler);

    for(int i=0; i < 2; ++i)
    {
        XMMATRIX world = m_Sprites[i].GetWorldMatrix();
        XMMATRIX mvp = XMMatrixMultiply( world, m_VpMatrix );
        mvp = XMMatrixTranspose(mvp);

        m_pD3DContext->UpdateSubresource(m_pMvpCB,0,0,&mvp,0,0);
        m_pD3DContext->VSSetConstantBuffers(0,1,&m_pMvpCB);

        m_pD3DContext->Draw(6,0);
    }

    m_pSwapChain->Present(0,0);
}
Run Code Online (Sandbox Code Playgroud)

那么,我应该如何使用多个顶点缓冲区、输入布局、着色器、混合器等有效地处理这个问题?

我是否应该创建这些版本的多个版本,然后在 …

c++ directx rendering direct3d direct3d11

4
推荐指数
1
解决办法
2207
查看次数

AVURLAsset 已正确初始化,但有时其关联的 AVPlayerLayer 仅呈现黑色

我有一个应用程序,用户可以在其中从本地视频文件中进行选择。当这些缩略图之一被推送时,用户会看到一个新视图,其中有一个我制作的用于显示视频的自定义视频播放器。

这可以完美地工作,但只是有时。有趣的是,如果用户选择一个新视频(从而呈现一个新视图,初始化一个新的自定义视频播放器对象)恰好 5 次,则用于呈现播放器视觉效果的底层 AVPlayerLayer 会呈现黑色,即使看起来基础资产仍然正确加载(播放器界面仍然保留正确的视频持续时间等)。

当一个新的自定义媒体播放器对象被初始化时(当加载包含视图的媒体播放器的视图控制器时发生),这是初始化程序方法的一部分,用于设置 AVPlayer 及其关联项:

    // Start to load the specified asset
    mediaAsset = [[AVURLAsset alloc] initWithURL:contentURL options:nil];

    if (mediaAsset == nil)
        NSLog(@"The media asset is zero!!!");

    // Now we need to asynchronously load in the tracks of the specified asset (like audio and video tracks). We load them asynchronously to avoid having the entire app UI freeze while loading occours
    NSString* keyValueToLoad = @"tracks";

    // When loading the tracks asynchronously we also specify …
Run Code Online (Sandbox Code Playgroud)

rendering mediaplayback ipad ios avplayer

4
推荐指数
1
解决办法
1497
查看次数

如何以编程方式有条件地从布局中删除块或容器?

如果有人想根据某些条件从产品详细信息页面中删除诸如 product.info.main 之类的容器(块),或者产品具有已分配值的属性。那么实现This的最佳方法是什么?

谢谢

layout rendering block magento2 magento2.2

4
推荐指数
1
解决办法
1548
查看次数

VkAttachmentReference::layout 的目的是什么?

我试图理解为什么我们需要VkAttachmentReference::layout?文档说:

layout是VkImageLayout指定附件在子通道期间使用的布局的值。

换句话说,它告诉在子通道开始之前附件将转换到哪个布局。

但是这些信息已经可以通过VkAttachmentDescription::initialLayout. 这是文档中的引用:

initialLayout 是渲染过程实例开始时附件图像子资源将处于的布局。

是不是VkAttachmentReference::layout冗余,因为它完全重复VkAttachmentDescription::initialLayout?

graphics rendering vulkan

4
推荐指数
1
解决办法
546
查看次数

VTK 渲染在 PyQt 中无法按预期工作

我需要在 PyQt 应用程序中集成 VTK 可视化。但是,当我将模型放入 QVTKRenderWindowInteractor 时,显示会显示一些不需要的透明效果(见下图)。无论我尝试加载什么,这都会发生在表面或点云上。

有没有办法在 QVTKRenderWindowInteractor 中实现正确的表示?

第一张图片是来自 的锥体vtk.vtkConeSource()。

锥体;  左:没有 QVTKRenderWindowInteractor。 右:使用 QVTKRenderWindowInteractor

第二张图片是来自 PCL 测试的cturtle.pcd 点云。

龟;  左:没有 QVTKRenderWindowInteractor。 右:使用 QVTKRenderWindowInteractor

左:没有 QVTKRenderWindowInteractor。右:使用 QVTKRenderWindowInteractor

我附上问题的示例代码以供复制。这是没有Qt的代码:

#!/usr/bin/env python

import vtk
from vtk.util.colors import tomato

"""This simple example shows how to do basic rendering and pipeline creation."""

cone = vtk.vtkConeSource()
cone.SetResolution(8)

coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInputConnection(cone.GetOutputPort())

coneActor = vtk.vtkActor()
coneActor.SetMapper(coneMapper)
coneActor.GetProperty().SetColor(tomato)
coneActor.RotateX(30.0)
coneActor.RotateY(-45.0)

ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)


ren.AddActor(coneActor)
ren.SetBackground(0.1, 0.2, 0.4)

iren.Initialize()

ren.ResetCamera()
ren.GetActiveCamera().Zoom(1.5) …
Run Code Online (Sandbox Code Playgroud)

qt rendering vtk python-3.x pyqt5

4
推荐指数
1
解决办法
1474
查看次数

在 Vulkan 中具有透明度的多个绘制调用之间是否需要同步?

我正在学习 Vulkan,我刚刚使用原始 ImGui 存储库中的 Vulkan-GLFW 示例将 ImGui 集成到我的代码中,并且运行良好。

现在我想同时在屏幕上渲染 GUI 和我的 3D 模型,由于 GUI 和模型肯定需要不同的着色器,我需要使用多个管道并提交多个命令。GUI 是部分透明的,所以我希望它在模型之后呈现。Vulkan 规范指出命令的执行顺序不太可能是我记录命令的顺序,因此我需要某种同步。在这篇 Reddit 帖子中,提出了几种完全实现我的目标的方法,我曾经相信我必须使用多个子通道(连同子通道依赖)或障碍或其他类似的同步方法来解决这个问题。

然后我查看了SaschaWillems 的 Vulkan 示例,尽管在 ImGui 示例中,我看到两个绘制调用之间没有同步,它只是先记录绘制模型的命令,然后记录绘制 GUI 的命令。

我很迷惑。在这种情况下真的需要同步,还是我误解了命令重新排序或混合?谢谢。

c++ synchronization rendering vulkan

4
推荐指数
1
解决办法
320
查看次数

CAMetalLayer 仅适用于 iOS 13.0

我正在使用CAMetalLayer绘制到 UIView 上。编译器会抛出一个CAMetalLayer仅在 iOS 13.0 上可用的警告。然而
,文档说iOS 8.0+。
我可以忽略这个警告吗?我这里只有 iOS 13.0 设备,我们也想支持 12 和 11。

在此处输入图片说明

rendering ios metal

4
推荐指数
1
解决办法
1066
查看次数

在图形管道中的哪个阶段进行剪辑?

我正在用 C++ 编写一个用于学习目的的软渲染器,但我已经遇到了一些障碍。我不知道我是否遗漏了什么,但我不确定何时执行剪辑。一些消息来源谈论它在应用透视投影矩阵之后但在透视分割之前(因此仍然在 3D 空间中)发生在剪辑空间中。其他来源谈到使用 Cohen-Sutherland 线裁剪算法等算法在 2D 空间(透视分割之后)执行它。如果我应该在 3D 空间中进行剪辑,那么深度缓冲区是否仅用于决定光栅化对象的顺序,还是必须在 2D 中进行剪辑,但还要防止 z 缓冲区中超出 -1 的点的光栅化?

基本上,关于这方面的信息不是很清楚,我实际上还没有看到如何在同构剪辑空间中实际剪辑。据说你应该这样做,但没有人展示如何。

c++ opengl graphics rendering clipping

4
推荐指数
1
解决办法
307
查看次数

如何防止标题栏在 Metal 中引起渲染问题?

当我绘制任何形状(无论是否有纹理)时,它会在我进入全屏时闪烁,并在我将鼠标移到顶部时显示标题栏。它会变轻,然后像一瞬间一样回来。我不知道纯色是否会发生这种情况,但是当我为顶点着色并绘制渐变或应用纹理时,就会发生这种情况。这很烦人,即使它很微妙。我该如何解决?

如何重现:在 Metal 中创建一个形状,或者为顶点着色以创建渐变,或者对其应用纹理,并使窗口全屏。将光标移动到窗口顶部。当标题栏出现时,形状/纹理会短暂闪烁。我该如何解决?

我正在使用 macOS 1.15 Catalina。

即使使用 Xcode 的示例 Metal 游戏也可以证明这一点。直接全屏显示,显示标题栏,显示和取消显示标题栏会不流畅。

更新:我已经意识到,如果我将绘图代码放入viewDidLoad()而不是draw()这种行为将停止。我如何制作它以便它没有错误而不必只渲染一帧?

另一个更新:纯色确实会发生这种情况。

这是一个非常困难的问题,因为我不知道该尝试什么。这个错误也很难修复,因为它只是偶尔发生。

错误示例(视频)

另一个显示“白色闪烁”的错误示例(视频)

另外这个问题只回答了一半,因为结果我设法解决了标题栏阻塞帧率的问题,但仍然存在白色闪光的问题。

macos rendering fullscreen swift metal

4
推荐指数
1
解决办法
613
查看次数

Three.js + OrbitControls - 未捕获的类型错误:无法读取未定义的属性“addEventListener”

我正在尝试OrbitControls在 THREE.js 中使用。如果我let cameraControl = new OrbitControls(camera)从下面删除该行,则不会出现错误。但是现在,我有“未捕获的类型错误:无法读取未定义的属性‘addEventListener’”

我尝试更改OrbitControls(camera)为THREE.OrbitControls(camera),然后出现“未捕获的类型错误:THREE.OrbitControls 不是构造函数”。

我尝试OrbitControls.js使用<script src=...></script>external"module"而不是导入import {OrbitControls} from ...;,但它不起作用,我也尝试移动let cameraControl = new OrbitControls(camera)到其他行,但也不起作用。

任何想法如何解决?


<body>

<script type="module">
import * as THREE from 'https://threejsfundamentals.org/threejs/resources/threejs/r115/build/three.module.js';
import {OrbitControls} from 'https://threejsfundamentals.org/threejs/resources/threejs/r115/examples/jsm/controls/OrbitControls.js';


let scene, renderer, camera
let cube

function init() {

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

  camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 100)

  let …
Run Code Online (Sandbox Code Playgroud)

javascript rendering render computer-vision three.js

4
推荐指数
1
解决办法
1524
查看次数