gpt4 book ai didi

c++ - 如何使用 "billboards"在屏幕上创建一个球形物体

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:09 29 4
gpt4 key购买 nike

我的任务是让太阳/月亮物体在整个时间跨度内(就像在平常的一天一样)在屏幕上流动。我可以使用的选项之一是使用“广告牌”,这是一个始终面向相机的四边形。

我还没有使用过很多 direct x 库或技术。这是我的第一个图形项目。这有什么意义?您如何使用它在屏幕上移动太阳物体?

谢谢 :) 这将只在 Windows 机器上运行,我只有直接 x 的选项(9)。

我已经完成了一半的工作。我显示了一张太阳图像,但无论我的相机指向哪个方向,它都位于屏幕前部,超过屏幕的 80%。我在低头看向地面?那里还有一个巨大的太阳。为什么是这样?这是我用来创建它的代码...

void Sun::DrawSun()
{
std::wstring hardcoded = L"..\\Data\\sun.png";
m_SunTexture = MyTextureManager::GetInstance()->GetTextureData(hardcoded.c_str()).m_Texture;


LPD3DXSPRITE sprite = NULL;

if (SUCCEEDED(D3DXCreateSprite(MyRenderer::GetInstance()->GetDevice(), &sprite)))
{
//created!
}

sprite->Begin(D3DXSPRITE_ALPHABLEND);

D3DXVECTOR3 pos;

pos.x = 40.0f;
pos.y = 20.0f;
pos.z = 20.0f;

HRESULT someHr;
someHr = sprite->Draw(m_SunTexture, NULL, NULL, &pos, 0xFFFFFFFF);
sprite->End();
}

显然,我的位置 vector 是硬编码的。这是我需要改变的吗?我在文档中注意到 D3DXSPRITE_BILLBOARD 而不是 D3DXSPRITE_ALPHABLEND 的可能性,这行得通吗?是否可以同时使用两者?

根据之前帖子中提到的教程,D3DXSPRITE 是一个 2d 对象,可能无法在 3d 世界中显示?什么是更明智的选择?

最佳答案

制作屏幕对齐四边形的最简单方法是使用带纹理重写的点 Sprite 。
我从来没有用 DirectX 这样做过,但在 OpenGL 中,启用点 Sprite 是 2 个 API 调用的问题,看起来像这样。

glEnable(GL_POINT_SPRITE);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, true);

启用此模式后,您绘制单个顶点而不是点,呈现屏幕对齐的四边形。坐标替换意味着渲染的四边形是用纹理坐标处理的。这意味着您可以在四边形上放置任何纹理。通常您会希望带有 alpha channel 的东西无缝地融入背景。

在 D3D 中应该有一种同样简单的方法来完成它。此外,如果您编写着色器,它可能允许您做一些额外的事情,例如丢弃纹理的一些像素。

This tutorial might help
还有,谷歌。

--编辑
要将四边形转换为任何其他形状,请使用纹理的 alpha channel 。如果 alpha 为 0,则像素不可见。您不能将 alpha channel 添加到 JPEG,但可以添加到 PNG。这是一个例子:

sun with alpha channel http://www.shiny.co.il/shooshx/sun.png

如果你在 photoshop 中打开这张图片,你会发现背景是不可见的。
如果场景中有其他事情发生,使用 alpha 混合可能会导致一些问题,因此如果发生这种情况,您可以编写一个简单的片段着色器,它会丢弃 alpha==0 的像素。

关于c++ - 如何使用 "billboards"在屏幕上创建一个球形物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1697931/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com