我正在研究这个学校项目,它吸引了两个兔子,你应该能够看透其中一个。请注意,整个代码只是教师制作的模板,我们应该用自己的代码填写。 所以我有一个遍历所有像素的循环而不是绘图然后立即我们应该将它们存储在Head和Node Buffer中。 HeadBuffer仅存储稍后在访问NodeBuffer时使用的索引。
见这里:http://developer.amd.com/wordpress/media/2013/06/2041_final.pdf
我的问题是在填充缓冲区后存储它时无法正确撤回值,所以我无法正确访问它以对其进行排序,混合颜色并写出来。
用C写的
宣称:
//in student.c
local:
int Q;
global:
S_Frag fragmentIn;
S_Frag *fragmentOut;
int *ext;
int index;
//up to here
typedef struct S_Vector
{
int size;
int reserved;
int elemSize;
char * data;
} S_Vector;
typedef struct S_Frag
{
S_RGBA color;
double depth;
int next;
} S_Frag;
//returns pointer to the i-th element
IZG_INLINE void * vecGetPtr(S_Vector *pVec, int i)
{
IZG_ASSERT(pVec && i < pVec->size);
return pVec->data + i * pVec->elemSize;
}
IZG_INLINE S_Frag makeFrag(S_RGBA color, double depth, int next)
{
S_Frag frag;
frag.color = color;
frag.depth = depth;
frag.next = next;
return frag;
}
//appends pElem to the end of S_Vector, returns index of new pElem
int vecPushBack(S_Vector *pVec, void *pElem);
//sets the i-th elem. of pVec to pElem
IZG_INLINE void vecSet(S_Vector *pVec, int i, void * pElem)
{
IZG_ASSERT(pVec && i < pVec->size && pElem);
MEMCOPY(pVec->data + i * pVec->elemSize, pElem, pVec->elemSize);
}
//student.c
Q = x + y*globWidth; //make 2 dimensional array 1 dimensional
ext = (int *) vecGetPtr(HeadBuffer, Q); //get index that was in headBuffer
fragmentIn = makeFrag(color, z, *ext); //put it in a new fragment
index = vecPushBack(NodeBuffer, &fragmentIn);//put new frag. in nodebuffer
vecSet(HeadBuffer, Q, &index);//update index in headbuffer
//here comes the messed up part
fragmentOut = (S_Frag *) vecGetPtr(NodeBuffer, index);
printf("::%d\n", fragmentOut->next);
// expected: -1 or 435 or 46 or 1120
// gotten: -8503629141
当我让循环运行并像这样打印它时,得到的值也会改变,但仍然是巨大的
Headbuffer初始化为持有sizeof(int)并保持宽度*高度(窗口的),每个元素在开头是-1
Nodebuffer设置为保存sizeof(S_Frag)的元素,vecPushBack()为我管理内存的东西
当我尝试printf()* ext,index,Q,fragmentIn.next时,一切看起来都很好
如果你能说出错误,我会非常感激,谢谢
哦,顺便说一句,除了my student.c文件,我无法改变其他任何内容
编辑:我也尝试使用
从片段中获取深度printf("::%f\n", fragmentOut->depth);
并且有一些0,-0.00000特定的数字和-1523 ... 25零...输出中的0.00000
答案 0 :(得分:0)
好吧,我只是弄清楚了,当然是我犯了错误而不是仔细检查......还有另一个清除缓冲区的功能,我认为它不会清除它们通常,但实际上它经常清除它们并导致所有混乱:D
感谢你的时间,解决了