小编Pil*_*pel的帖子

命名空间的多个别名?

是否可以拥有一个具有多个其他命名空间的所有声明的命名空间?像这样:

namespace std {...};
namespace glm {...};

namespace mynamespace = std; //mynamespace is an alias for std
namespace mynamespace += glm; //mynamespace will hold glm functions as well.
Run Code Online (Sandbox Code Playgroud)

c++

49
推荐指数
2
解决办法
1458
查看次数

为什么clock()被认为是坏的?

我曾经被建议使用平台相关的方法(GetTickCount()对于Windows)来获取时间而不是使用clock(),因为它很糟糕或不可靠.为什么?还有<chrono>许多人建议的这个标题功能,但是,我在我的IDE(VS 2010)中找不到它.

我的目标是游戏开发,如果重要的话.

c++ clock game-engine c++11

14
推荐指数
2
解决办法
1705
查看次数

gpu皮肤的矩阵计算

我正在尝试使用Assimp作为我的模型导入库在OpenGL中进行骨架动画.

我对骨骼offsetMatrix变量究竟需要什么?我需要将它乘以?

c++ opengl graphics matrix assimp

13
推荐指数
1
解决办法
2077
查看次数

将派生类转换为基础

在这里进行什么类型的演员表演B::get()

class A {
public:
    A() : a(0) {}
    int a;
};

class B : public A {
public:
    A* get() {
        return this; //is this C-style cast?
    }
};

int main()
{
    B b;
    cout << b.get()->a << "\n";

    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在着名的API中看到过这种代码.这是更好的做法static_cast<A*>(this);吗?

c++

12
推荐指数
1
解决办法
4601
查看次数

3D地图渲染在游戏中

我对3D游戏中的地图(即魔兽世界)以及程序员如何渲染它们有一些疑问,所以我不应该为每个人打开一个帖子,我想我应该在一个地方问他们所有人.

  1. 是否有可能通过某种技术"平滑"山脉的边缘,或唯一可能的解决方案是在高度图中使用更多的顶点? 在此输入图像描述 我错了,并认为他们使用某种技术,因为他们只是为每座山提供了相当数量的顶点?

  2. 看一下这张图片:http: //wow.gamona.de/wp-content/gallery/dun-morogh/dun_morogh_008.jpg 关于如何渲染这种场景的一些问题:

    1. 正如我被告知像WoW这样的开放世界游戏使用高度图进行地形渲染时,他们如何知道在哪里绘制所有其他东西?(树木,房屋,围栏,水等).
    2. 他们如何渲染地下区域?(山内有一座巨大的城堡)
    3. 请注意,每个凹凸使用大约2个纹理作为其显示(雪和岩石).他们用什么算法来知道何时采样每个纹理?它看起来不像它取决于法线.(我认为他们甚至不会为他们的地形生成法线.)
    4. 它看起来也不像天空盒用于地平线.它可以是什么技术?
    5. 你能说出你注意到我可以探索的其他有趣技巧吗?

我目前正在学习OpenGL,但我也标记了DirectX,因为这些问题并不是特定于API的.

opengl directx shader textures terrain

10
推荐指数
1
解决办法
1746
查看次数

glsl中的"flat"限定符?

所以我正在阅读"官方OpenGL指南",在他们教授材料照明的部分,他们突然在片段着色器中使用"平面"限定符作为输入变量.我想知道这件事,我想出的只是"平面阴影"和"平滑着色"以及它们之间的差异,我无法理解它与简单的"MatIndex"变量有什么关系.这是本书中的示例代码:

struct MaterialProperties {
vec3 emission;
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
};
// a set of materials to select between, per shader invocation
const int NumMaterials = 14;
uniform MaterialProperties Material[NumMaterials];
flat in int MatIndex; // input material index from vertex shader
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

opengl shader glsl

9
推荐指数
2
解决办法
2万
查看次数

基于四元数的相机

我尝试基于四元数学实现FPS相机.我存储一个旋转四元数变量,_quat并在需要时将其乘以另一个四元数.这是一些代码:

void Camera::SetOrientation(float rightAngle, float upAngle)//in degrees
{
    glm::quat q = glm::angleAxis(glm::radians(-upAngle), glm::vec3(1,0,0));
              q*= glm::angleAxis(glm::radians(rightAngle), glm::vec3(0,1,0));

    _quat = q;
}

void Camera::OffsetOrientation(float rightAngle, float upAngle)//in degrees
{
    glm::quat q = glm::angleAxis(glm::radians(-upAngle), glm::vec3(1,0,0));
              q*= glm::angleAxis(glm::radians(rightAngle), glm::vec3(0,1,0));

    _quat *= q;
}
Run Code Online (Sandbox Code Playgroud)

应用程序可以通过GetOrientation简单地将四元数转换为矩阵来请求方向矩阵.

glm::mat4 Camera::GetOrientation() const
{
    return glm::mat4_cast(_quat);
}
Run Code Online (Sandbox Code Playgroud)

应用程序按以下方式更改方向:

int diffX = ...;//some computations based on mouse movement
int diffY = ...;

camera.OffsetOrientation(g_mouseSensitivity * diffX, g_mouseSensitivity * diffY);
Run Code Online (Sandbox Code Playgroud)

这会在几乎所有轴周围产生不良的混合旋转.我究竟做错了什么?

opengl directx 3d graphics quaternions

9
推荐指数
2
解决办法
5825
查看次数

全屏与无边框窗口

我的目标是创建一个OpenGL应用程序.我见过许多游戏让用户决定"游戏窗口"是"全屏"还是"无边框".有什么不同?我如何实现每种方法?

我听说全屏窗口只是具有WS_POPUP样式的窗口,它被设置为屏幕的宽度和高度.这只适用于我上面提到的其中一种方法吗?

"无边框"和"全屏"之间有什么区别?(截图取自LoL) IMG

windows winapi

8
推荐指数
2
解决办法
6568
查看次数

用于遮挡剔除的分层Z缓冲

我正在阅读Real-Time Rendering 3rd Edition中的Occlusion Culling部分,我无法理解它是如何工作的.一些问题:

  1. 如何让"Z金字塔"有所贡献?为什么我们需要Z缓冲区的多个分辨率?在书中,它显示如下(左侧): 在此输入图像描述

  2. 八叉树结构是否与用于一般视锥体剔除和渲染的八叉树相同?或者它是专门用于遮挡剔除技术的专业八叉树?

  3. 一个更一般的问题:在前一部分(以及此处)中,遮挡查询术语被描述为"渲染对象的简化边界体积并将其深度结果与Z缓冲区进行比较,返回像素数量可见." OpenGL中的哪些功能与此Occlusion Query概念相关联?

  4. 这种技术是开放世界游戏遮挡剔除的标准吗?

opengl graphics occlusion-culling

5
推荐指数
1
解决办法
495
查看次数

将枚举传递给函数 - 按值还是按引用?

如果我错了,请纠正我,但是按值传递整数和其他基本数据类型的原因是因为它们占用的内存太小,所以制作该数据类型的指针变量是一种浪费(这可能会在大小至少与数据类型相同)。

这就是为什么我总是int按值将 s 和其他基本类型传递给函数,而其他(更大的)数据类型则通过 const 引用或 const 指针传递。我理解对了吗?

现在我看到许多 API 将enum类型作为 const 引用传递,如下所示:

enum FileOptions { ReadOnly, ReadWrite, WriteOnly };
void processFile(const FileOptions &options);
Run Code Online (Sandbox Code Playgroud)

据我所知,枚举通常被编译器解释为普通整数,那么为什么它们通过引用传递呢?这样做是为了从开发人员那里抽象数据类型,这样他就不会认为FileOptions是整数吗?(尽管确实如此)。

c++

5
推荐指数
1
解决办法
3423
查看次数