【发布时间】:2015-04-27 16:01:52
【问题描述】:
我正在做这个学校项目,它画了两只兔子,你应该能看穿其中一只。请注意,整个代码只是老师制作的模板,我们应该用我们自己的代码填充它。 所以我有一个循环遍历所有像素,而不是立即绘制,我们应该将它们存储在 Head 和 Node 缓冲区中。 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) 并保存它们的 width*heigth(of the window),每个元素的开头都是 -1
Nodebuffer 只是设置为保存 sizeof(S_Frag) 的元素,而 vecPushBack() 为我管理内存
当我尝试 printf() *ext、index、Q、fragmentIn.next 时,一切看起来都很好
如果你能指出错误,我将不胜感激,谢谢
哦,顺便说一句,除了我的 student.c 文件,我无法更改任何其他内容
编辑:我还尝试使用
从片段中获取深度printf("::%f\n", fragmentOut->depth);
输出中有一些 0 和 -0.00000 以及诸如 -1523...25 个零...0.00000 之类的数字
【问题讨论】:
-
vecGetPtr()返回一个 void 指针,该指针被强制转换为S_Frag*。只要NodeBuffer是S_Frag的向量,这不是问题......你如何确保它是这种情况? -
当渲染器被调用时,有一个函数会初始化所有内容和其中的一部分:NodeBuffer = vecCreateEmpty(sizeof(S_Frag ));
-
在 makefrag 函数中,它试图返回一个完整的结构。这不是好的做法。更好地分配一个结构,填写结构字段,然后返回一个指向结构的指针。
-
'typedef' 结构是一个坏主意。它使代码混乱,可能(而且经常是)误导,并使编译器名称空间混乱。
-
在创建结构的链表时,'next' 字段应该是指向结构类型的指针,而不是整数。