我正在为没有数学库的平台开发,所以我需要构建自己的工具.我目前得到分数的方法是将浮点数转换为固定点(乘以(浮点)0xFFFF,转换为int),只得到下部(掩码为0xFFFF)并再次将其转换回浮点数.
然而,不精确是杀了我.我正在使用我的Frac()和InvFrac()函数来绘制抗锯齿线.使用modf我得到一个非常流畅的线条.使用我自己的方法,由于精度损失,像素开始跳跃.
这是我的代码:
const float fp_amount = (float)(0xFFFF);
const float fp_amount_inv = 1.f / fp_amount;
inline float Frac(float a_X)
{
return ((int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
inline float Frac(float a_X)
{
return (0xFFFF - (int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我正在编写自己的COLLADA导入器.我已经相当远,加载网格和材料等.但我在动画方面遇到了障碍,特别是联合轮换.
我用来为我的网格蒙皮的公式是直截了当的:
weighted;
for (i = 0; i < joint_influences; i++)
{
weighted +=
joint[joint_index[i]]->parent->local_matrix *
joint[joint_index[i]]->local_matrix *
skin->inverse_bind_pose[joint_index[i]] *
position *
skin->weight[j];
}
position = weighted;
Run Code Online (Sandbox Code Playgroud)
就文献而言,这是正确的公式.现在,COLLADA为关节指定了两种类型的旋转:局部和全局.您必须将旋转连接在一起以获得关节的局部变换.
COLLADA文档没有区分的是联合的局部轮换和联合的全局轮换.但在我见过的大多数模型中,旋转可以具有rotate(全局)或jointOrient(本地)的id .
当我忽略全局旋转并仅使用本地旋转时,我得到了模型的绑定姿势.但是当我将全局旋转添加到关节的局部转换时,奇怪的事情开始发生.
这不使用全局轮换:

这是全球轮换:

在这两个截图中,我使用线条绘制骨架,但在第一个中它是不可见的,因为关节位于网格内部.在第二个屏幕截图中,顶点到处都是!
为了比较,这是第二个截图应该是这样的:

很难看到,但你可以看到第二个屏幕截图中的关节处于正确的位置.
但现在奇怪的是.如果我忽略了COLLADA指定的反向绑定姿势,而是采用关节的父本地变换的倒数乘以关节的局部变换,我得到以下结果:

在这个截图中,我从每个顶点到有影响的关节画一条线.我得到绑定姿势的事实并不那么奇怪,因为现在公式变为:
world_matrix * inverse_world_matrix * position * weight
Run Code Online (Sandbox Code Playgroud)
但它让我怀疑COLLADA的反向绑定姿势是在错误的空间.
所以我的问题是:COLLADA在什么空间指定其反向绑定姿势?如何将逆绑定姿势转换为我需要的空间?
我正在制作一个软件光栅化器,我遇到了一些障碍:我似乎无法使透视校正纹理映射工作.
我的算法是首先对坐标进行排序y.这将返回最高,最低和中心点.然后我使用三角洲走过扫描线:
// ordering by y is put here
order[0] = &a_Triangle.p[v_order[0]];
order[1] = &a_Triangle.p[v_order[1]];
order[2] = &a_Triangle.p[v_order[2]];
float height1, height2, height3;
height1 = (float)((int)(order[2]->y + 1) - (int)(order[0]->y));
height2 = (float)((int)(order[1]->y + 1) - (int)(order[0]->y));
height3 = (float)((int)(order[2]->y + 1) - (int)(order[1]->y));
// x
float x_start, x_end;
float x[3];
float x_delta[3];
x_delta[0] = (order[2]->x - order[0]->x) / height1;
x_delta[1] = (order[1]->x - order[0]->x) / height2;
x_delta[2] = (order[2]->x - order[1]->x) / height3;
x[0] = order[0]->x;
x[1] = …Run Code Online (Sandbox Code Playgroud) 我正在编写游戏的音频部分,我正在使用 OpenAL。我想使用一些扩展,但测试总是失败:
TRACE: AudioManager - Sound device: 'Generic Software'
TRACE: AudioManager - Enabling OpenAL extensions...
TRACE: AudioManager - Compressor support: NO
TRACE: AudioManager - Reverb support: YES
TRACE: AudioManager - Chorus support: NO
TRACE: AudioManager - Distortion support: NO
TRACE: AudioManager - Echo support: NO
TRACE: AudioManager - Flanger support: NO
TRACE: AudioManager - Frequency shifter support: NO
TRACE: AudioManager - Vocal morpher support: NO
TRACE: AudioManager - Pitch shifter support: NO
TRACE: AudioManager - Ring modulator support: NO
TRACE: …Run Code Online (Sandbox Code Playgroud) 我正在为移动设备(Windows Mobile 6和Android)开发跨平台2D引擎.我的Windows版本已经准备就绪,但我仍然需要确保在Android上提供相同的功能.
我想要的是Makefile项目的根目录,以及Makefile项目本身和测试应用程序的几个.
Makefile
---Engine
------Makefile
------src
------bin
------intermediate
---Tests
------TestOne
---------Makefile
---------src
---------bin
---------intermediate
------TestTwo
---------Makefile
---------src
---------bin
---------intermediate
Run Code Online (Sandbox Code Playgroud)
我正在尝试以下方面Makefile:
include ../makeinclude
PROGS = test1
SOURCES = $(wildcard *.cpp)
# first compile main.o and start.o, then compile the rest
OBJECTS = main.o start.o $(SOURCES:.cpp=.o)
all: $(PROGS)
clean:
rm -f *.o src
test1: $(OBJECTS)
$(LD) --entry=_start --dynamic-linker system/bin/linker -nostdlib -rpath system/lib -rpath $(LIBS) -L $(LIBS) -lm -lc -lui -lGLESv1_CM $^ -o ../$@
acpy …Run Code Online (Sandbox Code Playgroud) 我正在构建一个名为YoghurtGum的开源2D游戏引擎.现在我正在使用谷歌提供的NDK在Android端口上工作.
由于我在应用程序中遇到的错误,我很生气,所以我做了一个简单的测试程序:
class Base
{
public:
Base() { }
virtual ~Base() { }
}; // class Base
class Vehicle : virtual public Base
{
public:
Vehicle() : Base() { }
~Vehicle() { }
}; // class Vehicle
class Car : public Vehicle
{
public:
Car() : Base(), Vehicle() { }
~Car() { }
}; // class Car
int main(int a_Data, char** argv)
{
Car* stupid = new Car();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单,对吧?这是我编译它的方式,这与我编译其余代码的方式相同:
/home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-g++
-g
-std=c99
-Wall
-Werror
-O2
-w
-shared …Run Code Online (Sandbox Code Playgroud) 我们正在为GPGPU课程做作业。我们选择了一种算法,在CPU上实现了该算法,现在将其转换为OpenCL。
我们选择的算法将模型加载为一组三角形并将其栅格化为体素。体素定义为点数据的VBO。然后,我们使用几何体着色器将这些点转换为三角形的体素。
因此,我们的OpenCL程序需要获取一个三角形列表并输出一个可变的点列表。
输出可变长度数组似乎是个问题。
我们发现的解决方案是原子地增加一个计数器,并将该计数器用作输出数组的索引和数组的最终大小。除了...我们的两个GPU都不支持原子操作扩展。
到目前为止,这是我们所拥有的:
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_int64_extended_atomics : enable
#define POS1 i0 * 3 + 0
#define POS2 i0 * 3 + 1
#define POS3 i0 * 3 + 2
void WritePosition( __global float* OutBuffer, uint inIndex, __global float* inPosition )
{
OutBuffer[ inIndex * 3 ] = inPosition[0];
OutBuffer[ inIndex * 3 + 1] = inPosition[1];
OutBuffer[ inIndex * 3 + 2] = inPosition[2]; …Run Code Online (Sandbox Code Playgroud) 我正在为我们的学生游戏编写一个粒子系统,我遇到了一些障碍.我想改善对火箭的影响,但我似乎无法弄清楚如何.
这是效果在固定船上的效果:

这是它在移动的船上的样子:

我希望火焰始终保持相同的长度.这Particle是Tick功能:
void Particle::Tick(float a_DT)
{
// temporarily turned off to see the effect of the rest of the code more clearly
//m_Pos += m_Vel;
if (m_Owner) { m_Pos += m_Owner->GetParentSpeed(); }
m_Life -= 1;
if (m_Life <= 0) { m_Alive = false; }
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
编辑:为了清理一点,我希望效果能够跟踪,但我希望它能以相同的方式跟踪,而不管发射器的速度如何.