- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 C++ 和 DirectX 绘制一个确实适用于以下代码的球体:
struct Vertex
{
D3DXVECTOR3 position; //float x, y, z;
DWORD color;
};
void myApp::createAndFillVertexBuffer(){
int radius = 1;
float slices = 50;
float stacks = 50;
float sliceStep = 2*D3DX_PI / slices;
float stackStep = D3DX_PI / stacks;
int vertexCount = slices * (stacks - 1) + 2;
primitiveCount = slices * (stacks - 1) * 2;
m_D3DDev->CreateVertexBuffer(
sizeof(Vertex)*vertexCount,
D3DUSAGE_WRITEONLY,
D3DFVF_M_VERTEX,
D3DPOOL_DEFAULT,
&m_VB,
NULL);
Vertex *m_MVB;
HRESULT hRes = m_VB->Lock(0,0,(void**)&m_MVB,0);
if (hRes == D3D_OK)
{
int currentVertex = 0;
m_MVB[currentVertex++].position = D3DXVECTOR3( 0.0f, -radius, 0.0f );
float stackAngle = D3DX_PI - stackStep;
for (int i = 0; i < stacks - 1; i++)
{
float sliceAngle = 0;
for (int j = 0; j < slices; j++)
{
float x = (float)(radius * sinf(stackAngle) * cosf(sliceAngle));
float y = (float)(radius * cosf(stackAngle));
float z = (float)(radius * sinf(stackAngle) * sinf(sliceAngle));
m_MVB[currentVertex].position = D3DXVECTOR3(x,y,z);
m_MVB[currentVertex].color = D3DCOLOR_XRGB(255,200,100);
currentVertex++;
sliceAngle += sliceStep;
}
stackAngle -= stackStep;
}
m_MVB[currentVertex++].position = D3DXVECTOR3( 0.0f, radius, 0.0f );
m_VB->Unlock();
}
}
我使用顶点创建了一个球体,我应该只使用顶点,而不是 D3DXCreateSphere()
方法。我得到了如下所示的奇怪结果。我究竟做错了什么?
这是我想要的结果:
我又试了几个样本,但效果不佳。我试图将 indexBuffer 添加到我的算法中。这是结果算法,但它也工作错误:
int number_of_vertices, number_of_faces;
int slices= 20;
int stacks = 20;
float phi_step, phi_start;
float theta_step, theta, sin_theta, cos_theta;
int vertex, face;
int slice, stack;
number_of_vertices = 2 + slices * (stacks-1);
number_of_faces = 2 * slices + (stacks - 2) * (2 * slices);
primitiveCount = number_of_faces;
m_D3DDev->CreateVertexBuffer(
sizeof(Vertex)*number_of_vertices,
D3DUSAGE_WRITEONLY,
D3DFVF_M_VERTEX,
D3DPOOL_DEFAULT,
&m_VB,
NULL);
m_D3DDev->CreateIndexBuffer(sizeof(int) * number_of_faces*3,
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX32,
D3DPOOL_DEFAULT,
&pIbuf,
NULL);
Vertex *vertices;
HRESULT hRes = m_VB->Lock(0,0,(void**)&vertices,0);
WORD *faces;
HRESULT hRes2 = pIbuf->Lock(0, 0, (void**)&faces, 0);
if (FAILED(hRes2)) {
return;
}
phi_step = -2 * D3DX_PI / slices;
phi_start = D3DX_PI / 2;
theta_step = D3DX_PI / stacks;
theta = theta_step;
vertex = 0;
face = 0;
stack = 0;
vertices[vertex].position.x = 0.0f;
vertices[vertex].position.y = 0.0f;
vertices[vertex].position.z = radius;
vertices[vertex].color = D3DCOLOR_XRGB(255,200,100);
vertex++;
for (stack = 0; stack < stacks - 1; stack++) {
sin_theta = sinf(theta);
cos_theta = cosf(theta);
for (slice = 0; slice < slices; slice++) {
vertices[vertex].normal.x = sin_theta * cosf(phi_start);
vertices[vertex].normal.y = sin_theta * sinf(phi_start);
vertices[vertex].normal.z = cos_theta;
vertices[vertex].position.x = radius * sin_theta * cosf(phi_start);
vertices[vertex].position.y = radius * sin_theta * sinf(phi_start);
vertices[vertex].position.z = radius * cos_theta;
vertices[vertex].color = D3DCOLOR_XRGB(255,200,100);
vertex++;
phi_start += phi_step;
if (slice > 0){
if (stack == 0){
faces[face++] = 0;
faces[face++] = slice + 1;
faces[face++] = slice;
} else {
faces[face++] = sphere_vertex(slices, slice-1, stack-1);
faces[face++] = sphere_vertex(slices, slice, stack-1);
faces[face++] = sphere_vertex(slices, slice-1, stack);
faces[face++] = sphere_vertex(slices, slice, stack-1);
faces[face++] = sphere_vertex(slices, slice, stack);
faces[face++] = sphere_vertex(slices, slice-1, stack);
}
}
}
theta += theta_step;
if (stack == 0) {
faces[face++] = 0;
faces[face++] = 1;
faces[face++] = slice;
}
else {
faces[face++] = sphere_vertex(slices, slice-1, stack-1);
faces[face++] = sphere_vertex(slices, 0, stack-1);
faces[face++] = sphere_vertex(slices, slice-1, stack);
faces[face++] = sphere_vertex(slices, 0, stack-1);
faces[face++] = sphere_vertex(slices, 0, stack);
faces[face++] = sphere_vertex(slices, slice-1, stack);
}
}
vertices[vertex].position.x = 0.0f;
vertices[vertex].position.y = 0.0f;
vertices[vertex].position.z = -radius;
vertices[vertex].color = D3DCOLOR_XRGB(255,200,100);
vertices[vertex].normal.x = 0.0f;
vertices[vertex].normal.y = 0.0f;
vertices[vertex].normal.z = -1.0f;
for (slice = 1; slice < slices; slice++){
faces[face++] = sphere_vertex(slices, slice-1, stack-1);
faces[face++] = sphere_vertex(slices, slice, stack-1);
faces[face++] = vertex;
}
faces[face++] = sphere_vertex(slices, slice-1, stack-1);
faces[face++] = sphere_vertex(slices, 0, stack-1);
faces[face++] = vertex;
m_VB->Unlock();
pIbuf->Unlock();
函数spehereVetrex:
static WORD sphere_vertex(UINT slices, int slice, int stack)
{
return stack*slices+slice+1;
}
然后绘制图元:
m_D3DDev->SetStreamSource(0,m_VB,0,sizeof(Vertex));
m_D3DDev->SetIndices(pIbuf);
m_D3DDev->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,primitiveCount);
维特克斯:
#define D3DFVF_M_VERTEX (D3DFVF_XYZ |D3DFVF_NORMAL| D3DFVF_DIFFUSE)
Vetrex 结构:
struct Vertex
{
D3DXVECTOR3 position; //float x, y, z;
D3DXVECTOR3 normal;
DWORD color;
};
IDirect3DDevice9 *m_D3DDev;
IDirect3DVertexBuffer9 *m_VB; // Vertex Buffer
IDirect3DIndexBuffer9 *pIbuf;
//config D3DDevice
m_D3DDev->SetRenderState( D3DRS_LIGHTING, false );
m_D3DDev->SetRenderState( D3DRS_ZENABLE, TRUE );
m_D3DDev->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
m_D3DDev->SetFVF(D3DFVF_M_VERTEX);
结果:
最佳答案
从您发布的屏幕截图来看,您似乎正在使用线框作为填充模式,您应该使用实体模式,即 D3DFILL_SOLID。你应该给它一个白色来达到你的预期结果。
编辑:
尝试将剔除模式设置为 D3DCULL_NONE,此选项可确保渲染所有三角形。
关于c++ - DirectX 9 顶点球体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20747231/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!