Articles of 软件渲染

投影/视图matrix:对象比它应该大,深度不影响顶点

目前我正在尝试从头开始编写一个C 3D软件渲染引擎,只是为了好玩,并且深入了解OpenGL在幕后做了些什么,以及90年代的程序员必须在DOS上做什么。 我已经写了自己的matrix库,并没有注意到任何问题进行testing,但是当我试图在0,0,10投影一个简单的2×2立方体的顶点,如0,0,10基本相机看到,立方体似乎出现的方式大于应用程序的窗口。 如果我将顶点的坐标缩小8倍,我可以在屏幕上看到一个正确的立方体。 这个立方体似乎不是透视图,从前面看,后面的顶点与前面的顶点完全重叠,所以我很确定这是不正确的。 这是我如何创建视图和投影matrix(vec4_initd初始化w = 0的向量,vec4_initw初始化w = 1的向量): void mat4_lookatlh(mat4 *m, const vec4 *pos, const vec4 *target, const vec4 *updirection) { vec4 fwd, right, up; // fwd = norm(pos – target) fwd = *target; vec4_sub(&fwd, pos); vec4_norm(&fwd); // right = norm(cross(updirection, fwd)) vec4_cross(updirection, &fwd, &right); vec4_norm(&right); // up = cross(right, forward) vec4_cross(&fwd, &right, […]

如何将点积的强度映射到浮点RGB从0到1?

我得到了表面正常和光照位置的点积。 奇怪的是点积大于1。 此外,我想映射强度从0-> 1浮动RGB从0 – > 1。 这是我的代码相关的问题: if (the_object->polys[curr_poly].shading == 1) { // compute the dot product between the light source vector // and normal vector to surface normal.x = normal.x / Vector_Mag_3D((vector_3d_ptr)&normal); normal.y = normal.y / Vector_Mag_3D((vector_3d_ptr)&normal); normal.z = normal.z / Vector_Mag_3D((vector_3d_ptr)&normal); dp = Dot_Product_3D((vector_3d_ptr)&normal, (vector_3d_ptr)&light_source); // test if light ray is reflecting […]

软件和硬件渲染

据我所知,软件渲染和硬件渲染的主要区别在于,在软件渲染中,您使用CPU来确定每个像素的着色方式,在硬件渲染过程中让GPU负责计算并确定如何绘制每个像素。 但是,最终,不管是哪一种方法,都不需要像OpenGL这样的API来做实际的绘制? 我看到有人建立了一个基本的软件渲染引擎,而这个人说他使用OpenGL来完成渲染后的实际绘制。 那么最终还是需要像OpenGL或DirectX这样的API? 如果是这样的话,一台电脑至less要有一个集成的GPU或专用GPU才能显示任何东西,这是真的吗?

强制游戏使用Direct3D WARP

我正在研究一个研究项目,涉及使用软件光栅化程序(如WARP)来测量渲染3D游戏的性能和质量影响。 我想知道是否有办法强制游戏使用WARP。 也许更容易的是只使用支持使用warp或参考光栅化器的游戏。 有没有比较新的游戏(不超过8岁)支持? 我不记得在游戏中很长一段时间看到了这个选项。 如果没有工具或设置要做到这一点,我想我可以使用像Detours(http://research.microsoft.com/en-us/projects/detours/)或EasyHook(http://easyhook.codeplex .com /),并对代码执行二进制重写。 对于DirectX 10游戏,我认为它应该足以拦截CreateDevice调用并更改设备。 对于DirectX9游戏,是否可以将D3D9CreateDevice更改为D3D10CreateDevice? 我尝试从SDK的样品,似乎并非如此。 有什么建议在那里做什么?

等距画家的algorithm问题

注:我不使用瓷砖,我使用3D多边形:) 我目前正在为扫描的真实生活对象制作一个实时渲染器。 我的主要目标是有一个简单的旋转对象的等距观众。 这本身就是一个简单的问题。 我基本上已经有了完整的解决scheme,但是我并不满意。 你可能知道,基于CPU的软件渲染速度很慢(但是我不想编写一个游戏引擎,只是一个小的浏览器,应该可以像低于10000的低多边形计数),但是对于我所需要的令人惊讶的好。 我的渲染器太慢的唯一部分是z缓冲区(对于3000多对象,多秒)。 主要是因为它循环x y对象*多边形。 目前我使用某种画家algorithm来绘制多边形,这给我带来了一些问题: https : //youtu.be/PDq4xtrgoi8 正如你所看到的,每个poly的距离计算非常差,只是poly到世界点1000,1000,1000的中心。 我的问题不只是关于指针algorithm,但我喜欢用一个最小的失败的方法绘制多边形以特定的顺序,而不是通过z缓冲计算每个像素。 如果你有其他简单的方法在CPU上快速工作,我真的很感激听到他们! 🙂

背面剔除错误(在世界空间)

我编写简单的软件渲染器。 在我的管道中,我有背面剔除的阶段。 但看起来有一些错误。 我在世界转变之后立即进行扑杀(这是否正确?)。 Vector3F view_dir(0.0f, 0.0f, 1.0f); std::vector<Triangle> to_remove; for (Triangle &t : m_triangles) { Vector4F e1 = t.v2 – t.v1; Vector4F e2 = t.v3 – t.v1; Vector3F normal( e1.y * e2.z – e1.z * e2.y, e1.z * e2.x – e1.x * e2.z, e1.x * e2.y – e1.y * e2.x ); normal.Normalize(); float dot […]

单CPU核心graphics渲染技术?

我对在平均CPU上使用单线程的2D和3D渲染方法感兴趣(例如,用于编写旧式和低端PC的游戏)。 虽然我在使用OpenGL和着色器时通常没有任何性能问题,但我几乎不了解如何在不使用GPU的情况下实现实时3D,光照或某些效果(如模糊,其他卷积或透视变换),并且速度足够快。 我知道一些明显的优化技术(预先计算函数,以较低的分辨率渲染,然后拉伸,分别计算每个轴的卷积),但是它们往往不能为我的应用提供足够的性能。 是否有任何来源(或关键字的谷歌),我可以find有关平台独立渲染优化和CPU的algorithm?

透视正常值的正确插值

我目前正在编写一个软件光栅化程序,而且我可以使用顶点颜色和透视图正确地绘制任意三角形。 我通过对顶点法线进行线性插值来进行点定向照明,并且它的工作正常,只有在大三角形上,您才能注意到从非常平坦的角度看光线变形。 然而,这只有当你特别寻找它时才可见,但是我想知道是否有办法对法线进行透视矫正。 对于纹理坐标和其他东西,这是通过将值除以W或Z来完成的。但是,如果将vector除以单个数字,则只改变它的幅度,这是无用的,因为我最后正常化vector用于照明计算。 那么,有没有办法做到这一点?

我如何以编程方式确定是否可以创建硬件D3D设备?

我有一个D3D 11应用程序,我想添加对软件渲染的支持。 这是因为在某些情况下,它将在远程桌面或者没有GPU的机器上运行。 从我所做的研究来看,我最好的select就是WARP 。 将应用程序更改为使用WARP令人惊讶的简单: hr = D3D11CreateDevice( NULL, D3D_DRIVER_TYPE_WARP, // was D3D_DRIVER_TYPE_HARDWARE NULL, creationFlag, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &mDevice, &mFeatureLevel, &mDeviceContext ); 它运行良好。 我正在努力的是决定何时将驱动程序types设置为WARP而不是硬件。 有一个function,我可以打电话告诉我,如果硬件支持可用的系统? 我正在使用具有9_1function级别的D3D 11。

有没有一个3Danimation软件优先使用代码而不是GUI?

我所面对的所有3Danimation软件都围绕使用GUI工作:窗口,菜单,鼠标点击,鼠标调整,键盘快捷键。 作为一名程序员,我发现这种限制。 为了完全控制animation,使用代码会很有趣。 例如,假设你想要制作一种依赖速度的魔法animation。 没有编程,这是不可能的。 于是我问:有没有一个3Danimation软件的目标编码,而不是GUI工作?