标签: rendertarget

在一块白板上绘图(渲染目标)被复制到所有白板?

我正在使用虚幻引擎4 VR内容示例,它有一个可以绘制的白板.它使用渲染目标将线条渲染到画布.

问题是,当我将白板复制到级别中的其他位置时,它会显示相同的图形,如下所示:

重复绘图

这是我使用的材料和纹理:

材质和渲染目标纹理

我尝试制作材料和纹理的副本并在其中一个白板上使用它,但结果相同.我不确定为什么渲染目标没有实例/唯一?为什么它在白板的多个实例上绘制相同的东西?

编辑(附加详细信息):我制作了原始渲染目标的副本,并尝试指定相反,我还制作了原始的材质实例,并为复制指定了但仍然是同一个问题.我试图动态创建一个渲染目标和材质实例,你可以在这里看到https://answers.unrealengine.com/questions/828892/drawing-on-one-whiteboard-render-target-is-copied.html,但是我无法借鉴它; 所以我只对其中两个做了它,它仍然有同样的问题

rendertarget unreal-engine4

6
推荐指数
1
解决办法
481
查看次数

在紫色屏幕中更改RenderTarget结果?

我试图在运行时更改RenderTargets,因此我可以在运行时绘制一些元素,操纵它们,然后最终将纹理绘制到屏幕上.问题是,如果我在运行时更改RenderTarget,屏幕会变为紫色.这是我在Draw中得到的代码:

        RenderTarget2D tempTarget = new RenderTarget2D(GraphicsDevice, 128, 128, 1,
            GraphicsDevice.DisplayMode.Format, GraphicsDevice.PresentationParameters.MultiSampleType,
            GraphicsDevice.PresentationParameters.MultiSampleQuality, RenderTargetUsage.PreserveContents);

        GraphicsDevice.SetRenderTarget(0, tempTarget);
        GraphicsDevice.Clear(ClearOptions.Target, Color.SpringGreen, 0, 0);
        GraphicsDevice.SetRenderTarget(0, null);
Run Code Online (Sandbox Code Playgroud)

如果我在运行时创建RenderTarget似乎并不重要(我确实需要在运行时创建内存中的纹理并使用SpriteBatch绘制它们),这会导致完全紫色的屏幕.我该怎么做才能解决这个问题?

c# xna rendertarget

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

Direct3D:从IDirect3DSurface9(默认池)获取系统内存位图的有效方法?

我有IDirect3DSurface9,默认池,YUV格式.我怎样才能有效地从中获取位图位?目前我:

    创建渲染目标:
    device->CreateRenderTarget(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL)
    将YUV转换为RGB32 :(
    device->StretchRect(videomem_surf, NULL, render_target_, NULL, D3DTEXF_NONE)
    完整的矩形,无拉伸)
    在系统内存中创建普通的屏幕外表面
    device->CreateOffscreenPlainSurface(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL)
    将数据从视频mem复制到sysmem:
    device->GetRenderTargetData(render_target, sysmem_offscreen_surface)
    来自屏幕外表面的GetDC,创建兼容的DC和兼容位图,BitBlt从屏幕外的sufrace DC到兼容的DC,并通过GetDIBits()将位图位复制到我的缓冲区

这看起来有点开销,因为有很多复制:从原始表面到渲染目标,然后到屏幕外表面,再到兼容位图,最后到我的缓冲区.如何改进?

谢谢

directx direct3d direct3d9 rendertarget

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

GDI 渲染到 direct2D ID2D1BitmapRenderTarget 总是透明的

我想将我的电影渲染软件从 DirectDraw 移植到 Direct2D。由于兼容性问题,GDI 渲染需要在图像之上完成。为了优化性能,我想实现某种后台缓冲机制,但是 alpha 通道信息似乎存在问题,所有 GDI 绘图似乎都以某种方式透明

我为我的窗口句柄创建了一个ID2D1HwndRenderTarget,并创建了一个ID2D1Bitmap来复制图像。位图的像素格式为DXGI_FORMAT_B8G8R8A8_UNORM,alpha 模式为D2D1_ALPHA_MODE_IGNORE。HwdRenderTarget 是 GDI 兼容的,所以我的渲染函数看起来像这样:

HwdRenderTarget.BeginDraw;
HwdRenderTarget.DrawBitMap(myBitMap);
HwdRenderTarget.GetDC(dc);

... do GDI drawing here ...

HwdRenderTarget.ReleaseDC();
HwdRenderTarget.EndDraw;
Run Code Online (Sandbox Code Playgroud)

这个版本工作得很好:GDI 对象使用纯色绘制,DrawTextEx-Text 具有透明背景。

为了优化性能,我想在“后台缓冲区”中进行 GDI 绘图,因此只需要在发生变化时才需要完成。否则我只能渲染缓存的位图。位图是空的和透明的,所以只有绘制的对象应该是可见的。

所以我创建了一个 CompatibleRenderTarget ID2D1BitmapRenderTarget,alpha 模式是D2D1_ALPHA_MODE_PREMULTIPLIED

 HwdRenderTarget.CreateCompatibleRenderTarget(nil, nil, nil, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE, CompatibleRenderTarget);
Run Code Online (Sandbox Code Playgroud)

现在我在 CompatibleRenderTarget 中进行 GDI 渲染:

CompatibleRenderTarget.BeginDraw;
if Supports(CompatibleRenderTarget, ID2D1GdiInteropRenderTarget, GdiInteropRenderTarget) then
begin
  GdiInteropRenderTarget.GetDC(D2D1_DC_INITIALIZE_MODE_CLEAR, dc);

  ... do GDI drawing here ...

  GdiInteropRenderTarget.ReleaseDC(fDstSize);
end;
GdiInteropRenderTarget := nil;
CompatibleRenderTarget.EndDraw;
CompatibleRenderTarget.GetBitmap(BackBuffer); …
Run Code Online (Sandbox Code Playgroud)

transparency gdi direct2d rendertarget

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

渲染到纹理时的 DX11 Alpha 混合

最终编辑:

已解决...只需深入了解 alpha 混合如何工作。我应该有: oBlendStateDesc.RenderTarget[a].DestBlendAlpha = D3D11_BLEND_ZERO; ...设置为 D3D11_BLEND_ONE 以保留 Alpha。

当渲染到后台缓冲区时,问题不会被注意到,因为颜色混合正常,这就是最终输出。当渲染到纹理时,同样的情况也适用,然后将纹理渲染到后缓冲区,不正确的 alpha 会导致错误地将纹理混合到后缓冲区。

然后我遇到了另一个问题,阿尔法似乎在减少。这是因为颜色混合了两次,例如......

Source.RBGA = 1.0f, 0.0f, 0.0f, 0.5f
Dest.RGBA   = 0.0f, 0.0f, 0.0f, 0.0f
Run Code Online (Sandbox Code Playgroud)

渲染成纹理...

Result.RGB = Source.RBG * Source.A +  Dest.RGB * (1 - Source.A) = 0.5f, 0.0f, 0.0f
Result.A   = Source.A * 1 + Dest.A * 1 = 0.5f
Run Code Online (Sandbox Code Playgroud)

现在...

Source.RBGA = 0.5f, 0.0f, 0.0f, 0.5f
Dest.RGBA   = 0.0f, 0.0f, 0.0f, 0.0f
Run Code Online (Sandbox Code Playgroud)

渲染到后台缓冲区...

Result.RGB = Source.RBG * Source.A +  Dest.RGB * (1 - Source.A) = …
Run Code Online (Sandbox Code Playgroud)

c++ alphablending directx-11 render-to-texture rendertarget

5
推荐指数
0
解决办法
3548
查看次数

一次渲染渲染到完整的3D渲染目标

使用DirectX 11,我创建了一个可以绑定为渲染目标的3D体积纹理:

D3D11_TEXTURE3D_DESC texDesc3d;
// ...
texDesc3d.Usage     = D3D11_USAGE_DEFAULT;
texDesc3d.BindFlags = D3D11_BIND_RENDER_TARGET;

// Create volume texture and views
m_dxDevice->CreateTexture3D(&texDesc3d, nullptr, &m_tex3d);
m_dxDevice->CreateRenderTargetView(m_tex3d, nullptr, &m_tex3dRTView);
Run Code Online (Sandbox Code Playgroud)

我现在想要更新整个渲染目标并用像素着色器中生成的程序数据填充它,类似于使用"全屏通道"更新2D渲染目标.生成数据所需的一切都是所讨论像素的UVW坐标.

对于2D,可以构建渲染全屏三角形的简单顶点着色器:

struct VS_OUTPUT
{
    float4 position : SV_Position;
    float2 uv: TexCoord;
};

// input: three empty vertices
VS_OUTPUT main( uint vertexID : SV_VertexID )
{
    VS_OUTPUT result;
    result.uv = float2((vertexID << 1) & 2, vertexID & 2);
    result.position = float4(result.uv * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f), 0.0f, 1.0f);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我很难绕过如何采用3D原理.这是即使在DirectX 11的可能,还是我的描述来呈现给卷纹理的个体片在这里

hlsl directx-11 rendertarget 3d-texture

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

如何访问 WebGLRenderTarget 纹理内容

因此,我将场景渲染为纹理,然后我需要在 js 中处理纹理,然后修改内容或从一组值创建新纹理。

似乎我需要获取 WebGL 上下文并直接与 WebGL 接口来完成此操作。有人知道这样做的最佳方法吗?

render-to-texture rendertarget three.js

3
推荐指数
1
解决办法
2480
查看次数

如何渲染到OpenGL Cubemap纹理的一面

我正在制作一个立方体贴图渲染目标类。我已经有一个2D的作品了。但是对于这个立方体贴图渲染目标类,我希望能够根据需要渲染到特定的面孔。也许我想在“ X +”面上渲染圆,但在“ Y +”面上渲染三角形。

这是我班的样子

class CRenderTarget 
{
private:
    //frame buffer to render on
    unsigned  m_uifboHandle;

    //depth stencil 
    unsigned  m_uiDepthStencilHandle;

    //the texture we will render on
    unsigned  m_uiTextureHandle;

public:
    CCubeRenderTarget( void );

    ~CCubeRenderTarget( void );

    void Create( unsigned uiHeightWidth = 512,
             int iInternalFormat = 0x1908 ); //GL_RGBA

    void Bind( void );

    void UnBind( void );
}
Run Code Online (Sandbox Code Playgroud)

这就是我的create函数的样子

void Create( unsigned uiHeightWidth, int iInternalFormat )
{
        //generate our variables
    glGenFramebuffers(1, &m_uifboHandle);
    glGenRenderbuffers(1, &m_uiDepthStencilHandle);
    glGenTextures(1, &m_uiTextureHandle);

    // Initialize FBO
    glBindFramebuffer( GL_FRAMEBUFFER, …
Run Code Online (Sandbox Code Playgroud)

opengl framebuffer rendertarget

2
推荐指数
1
解决办法
2088
查看次数

RenderTargetView到ShaderResourceView

我来自XNA,在那里我可以轻松创建一个rendertarget并将其用作简单的"Texture2D".我创建了一个ID3D11RenderTargetView对象和一个ID3D11ShaderResourceView对象.我将我的精灵绘制到渲染目标,然后将其用作ShaderResourceView将其发送到着色器.

我尝试查询rendertarget的界面,如:

ID3D11ShaderResourceView *resource= NULL;
renderTargetobject->QueryInterface<ID3D11ShaderResourceView >(&resource);
Run Code Online (Sandbox Code Playgroud)

上面的代码没有为"资源"对象生成任何可用的值,我想每帧发送到我的着色器(我试图做一个简单的反射).

directx resources shader directx-11 rendertarget

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

THREE.js渲染目标纹理不会在不同的场景中绘制

因此,如果任何THREE.js专业人员都能理解为什么我无法将WebGLRenderTarget用作另一个场景中的飞机材料,我会非常高兴.

它现在如何工作是我用透视相机创建一个场景,渲染一个简单的平面.这发生在Application对象中.

我还有一个使用另一个场景和正交相机的WaveMap对象,并使用片段着色器在另一个占据整个屏幕的四边形上绘制cos(x)*sin(y)函数.我将其渲染为纹理,然后创建一个使用此纹理的材质.

然后,我传递要在Application对象中使用的Material,以在我提到的第一个平面上绘制纹理.

问题是出于某种原因我可以使用WaveMap对象内的正交相机在场景中工作,但是在传递材料之后,在Application对象中没有透视相机的场景中.:(

我试过简单地传递一个纯色的简单材质,但是当我尝试传递一个使用WebGLRenderTarget作为纹理的材质时,它不会再出现了.

https://github.com/ArminTaheri/rendertotexture-threejs

javascript rendertarget three.js

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