本系列的Tutorial源代码及示例均来自Microsoft DirectX SDK (June 2010)里的Samples。在学习Direct3D 11的过程中,产生了些许感悟,以此开篇记录下学习过程。
P.S.本博客非教程,估计只有笔者自己看得懂,搜教程的各位如果看不懂就不要在这浪费时间了。。。
Tutorial 01: Direct3D 11 Basics
Q1.创建资源,使用资源
a) Device创建资源。(device是啥?对窗口程序来说就是整个窗口!对全屏程序来说就是屏幕!)
b) Immediate Context(device context的一种)渲染到buffer。(device context是啥?就是可以画图的地方。对窗口程序来说,就不包括边框)
c) Swap chain有front buffer, back buffer。
d) D3D11CreateDeviceAndSwapChain()的时候,其实造了三样东西:device,deviceContext, swapchain。
Q2.Front buffer只可读。Device使用deviceContext渲染到back buffer。
Tutorial 02: Rendering a Triangle
Q3.xxxview
xxx是资源,它配套的view可以理解为一个指针,指向xxx的部分或全部资源。
从swap chain获取backbuffer,然后用这个backbuffer在device创建render target view,然后把这个render target view绑定到device context,这样才能让pipeline通过render target view渲染到backbuffer。(只是因为在人群中多看了你一眼~这一眼要用“造”的)
Q4.OpenGL里,VBO的layout是通过glVertexAttribArray等来设置的;DX里,VBO的layout是要让device来造的,设置好layout后,把该layout set到device context。
Q5. DX的VBO和它的layout一样,要先造(当然是通过device来造啦),然后再让device context来设。造buffer时,要传两个描述性结构:一个D3D11_BUFFER_DESC描述buffer,一个D3D11_SUBRESOURCE_DATA描述数据。
Q6. VBO将所有数据随他送到GPU端,然后shader到VBO里拿数据。(而不是到CPU来拿数据!)
Q7. 设置拓扑,DX不像OGL在Draw的时候指定(glDrawArrays(GL_TRIANGLES, ...)),而是通过device context来指定D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST或者D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP等,方法是调用IASetPrimitiveTopology()。
有了IndexBuffer就可以用DrawIndexed()。就像OpenGL里有了EBO就可以用glDrawElement()。
Q8. DX在渲染每个物体前调用了VSSetShader()和PSSetShader()。相当于OpenGL里的glUseProgram()。
Q9. 光栅化resterization: 将三角形转化为pixel。
Tutorial 03: Shaders
Q10. Vertexshader, pixelshader的输出去向:back to pipeline.
Tutorial 04: 3D Spaces
Q11. Constant buffer:就是OpenGL里的uniform buffer。
在vertex buffer里如下声明:
cbuffer ConstantBuffer : register( b0 )
{
matrix World;
matrix View;
matrix Projection;
}
未完待续。。。