创建光栅化器时,我像这样设置光栅化器描述:
rasterDesc.AntialiasedLineEnable = false;
rasterDesc.CullMode = D3D11_CULL_BACK;
rasterDesc.DepthBias = 0;
rasterDesc.DepthBiasClamp = 0.0f;
rasterDesc.DepthClipEnable = true;
rasterDesc.FillMode = D3D11_FILL_SOLID;
rasterDesc.FrontCounterClockwise = true;
rasterDesc.MultisampleEnable = false;
rasterDesc.ScissorEnable = false;
rasterDesc.SlopeScaledDepthBias = 0.0f;
Run Code Online (Sandbox Code Playgroud)
这工作正常。但是当我更改FrontCounterClockwise为false. 什么都没有渲染(我想一切都被剔除了)。我是否误解了目的FrontCounterClockwise?因为我在期待,它会将顺时针面作为正面而不是逆时针面。我究竟做错了什么?
编辑:这是完整的初始化代码:
bool irrFireDX11::INITIALIZE(int screenWidth, int screenHeight, bool vsync)
{
HRESULT result;
IDXGIFactory* factory;
IDXGIAdapter* adapter;
IDXGIOutput* adapterOutput;
unsigned int numModes, i, numerator, denominator, stringLength;
DXGI_MODE_DESC* displayModeList;
DXGI_ADAPTER_DESC adapterDesc;
int error;
DXGI_SWAP_CHAIN_DESC swapChainDesc;
ID3D11Texture2D* backBufferPtr;
D3D11_TEXTURE2D_DESC depthBufferDesc;
D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
D3D11_RASTERIZER_DESC …Run Code Online (Sandbox Code Playgroud) 我正在开发一个渲染引擎,它使用绘制间接和实例渲染来渲染场景几何体。一些对象是根据实例化的基本形状(例如立方体或球体)按程序生成的,其他对象是在整个场景中实例化和使用的网格对象。现在,实例化几何体是使用对 glDrawElementsInstanced 的单独绘制调用来绘制的(现在有效,但通常不好),并且使用对 glMultiDrawElementsIndirect 的单个调用来绘制单个对象(在统一的 VBO 中)。由于我在渲染管道中使用照明和纹理(无绑定),并且场景很复杂,总共有数十万个网格,因此我需要实现 GPU 遮挡和视锥体剔除。两者都需要它:减轻片段着色器和顶点着色器的负担。
对我来说,主要问题是找到一种合理的方法来对实例几何体执行这些 GPU 剔除操作。虽然对于仅渲染一次的对象(使用间接绘制),所有剔除内容都通过示例很好地说明了,但它们似乎都没有解决实例网格物体的剔除问题。这样做似乎没有真正的障碍,但如何以最佳方式实现这一点。
我建议如下:
问题是:这种实例数据的复制(复制到两个单独的缓冲区中)是否合理,或者是否有更有效的方法?
在openGL中,我有一个对象,我沿着轴缩放-1 ...这会导致对象无法正确渲染,因为所有正面现在都是背面.如果没有禁用剔除,我将如何让这个对象正确渲染?有没有办法在不修改构成我模型的纹理法线顶点的情况下做到这一点?
嘿伙计们,我正在渲染旧游戏中的旧几何体.他们的客户有一些算法,让他们可以看到附近的区域,但我没有这种能力所以我正在考虑剔除不必要的多边形.目前,我正在渲染整个区域中的每个多边形,无论我是否能够看到它,无论它是否在视觉范围内.显然这是完全没有效率的.我的问题:
我应该使用什么类型的剔除.我知道我可以剔除不在平截头体中的多边形,这将有助于减轻一些负荷,但我可以说,选择不渲染距离相机一定距离的多边形吗?这个叫什么?我也在某些地区使用雾.同样的问题.我可以想出一种方法,我可以剔除雾后面的一切,我看不到的区域.
谢谢:这项工作的截图正在进行中.有些人可能会认出它:)另外,忽略叶子的丑陋颜色.我没有考虑到alpha遮罩.
我正在尝试创建一个简单的单元着色器效果,它涉及背面和正面剔除。但到目前为止,我的剔除结果相当奇怪。
设置OpenGL源代码:
// init matrices
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 800 / 600, 0.01f, 150);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// enable opengl caps
glEnable(GL_NORMALIZE);
glEnable(GL_CULL_FACE);
// cell shading effects
glLineWidth(3.5f);
// setup display list
pDList = glGenLists(1);
glNewList(pDList, GL_COMPILE);
glBegin(GL_QUADS);
// front
glNormal3f(0, 0, 1);
glVertex3f(-0.25f, -0.5f, -3);
glVertex3f(0.25f, -0.5f, -3);
glVertex3f(0.25f, -1, -3);
glVertex3f(-0.25f, -1, -3);
// back
glNormal3f(0, 0, -1);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -1, -3.5f);
glVertex3f(-0.25f, -1, -3.5f);
// top
glNormal3f(0, 1, 0);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, …Run Code Online (Sandbox Code Playgroud) 从文档:
默认渲染器不执行任何 CPU 端视口裁剪或遮挡检测。如果某些东西不应该是可见的,它就不应该被显示出来。使用
Item::visible: false于不应该被绘制的项目。不添加这样的逻辑的主要原因是它增加了额外的成本,这也会损害表现良好的应用程序。
那么有没有一个技巧可以轻松做到这一点,而无需自己实施呢?
请注意,在我的情况下,可见区域之外的项目在那里,因为它们在 a 中ScrollView并且它们没有滚动到。
我想要剔除的原因是为了减少全场景重绘的 CPU 使用率。
我试图用 dx11 绘制一个简单的正方形,但每个三角形的索引顺序决定了它是否出现。我在光栅化器状态下将剔除模式设置为无,但它似乎没有任何改变。
如果我将第一个三角形的顶点指定为 0, 1, 2 而不是 2, 1, 0 则三角形不会出现。所以我的问题是,无论剔除模式如何,我都需要以特定方式对三角形的顶点进行排序吗?
PS我正在绘制三角形列表而不是条带。
UINT indices[] = {2, 1, 0,
1, 3, 0};
MeshVertex vertices[] =
{
{ Vector3(1.0f, 1.0f, 0.0f)}, //Top Right
{ Vector3(-1.0f, -1.0f, 0.0f)}, //Bottom Left
{ Vector3(1.0f, -1.0f, 0.0f)}, //Bottom Right
{ Vector3(-1.0f, 1.0f, 0.0f)} //Top Left
};
mesh = new Mesh(vertices, indices, 4, 6, shader);
Run Code Online (Sandbox Code Playgroud) 我正在开始尝试使用WPF 3D渲染,我面临的第一个问题是如何禁用面部剔除.我知道如何在DirectX和OpenGL中做到这一点,但我找不到在WPF中这样做的方法.这是我的ViewPort标记.模型在运行时生成,它是GeometryModel3D中的MeshGeometry3D
<Viewport3D x:Name="viewport" DockPanel.Dock="Right" Margin="0" >
<Viewport3D.Camera>
<PerspectiveCamera x:Name="camera" FarPlaneDistance="50" LookDirection="0,0,-10"
UpDirection="0,1,0" NearPlaneDistance="0" Position="0,0,5"
FieldOfView="45" />
</Viewport3D.Camera>
<ModelVisual3D x:Name="model">
<ModelVisual3D.Content>
<Model3DGroup x:Name="group">
<AmbientLight Color="DarkGray" />
<DirectionalLight Color="White" Direction="-5,-5,-7" />
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
Run Code Online (Sandbox Code Playgroud)
非常感谢您给我的任何建议.
出于性能原因,我正在考虑使用VBO而不是立即模式.我正在创建一个充满精灵的2D正交场景.我不想画出屏幕外的精灵.我通过检查它们相对于屏幕尺寸和相机位置的位置来做到这一点.
在立即模式下,这很简单; 每个精灵都有draw方法.使用VBO这似乎并不重要; 我一次渲染VBO的整个部分.我(我能想到)没有办法选择不渲染屏幕外的精灵.
DirectX 如何确定多边形缠绕顺序?我特别好奇背面剔除。通过研究,我发现 DX 计算表面法线并取其与相机矢量的点积,如果大于 0 则剔除。
首先,这是 DirectX 实际采用的技术吗?其次,如果是这种情况,假设每个表面都有两个法线(一个与另一个相对),DirectX 如何知道使用哪一个法线?