大佬教程收集整理的这篇文章主要介绍了c – GLSL停止渲染,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
glEnable(GL_TEXTURE_1D); glGentextures(1,&_texturE); glBindTexture(GL_TEXTURE_1D,_texturE); glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage1D(GL_TEXTURE_1D,GL_RGBA,pc->pc.size(),GL_FLOAT,&pc->pc.front()); glBindTexture(GL_TEXTURE_1D,0);
‘pc’只是一个包含结构Point的向量的类,它只有浮点数x,y,z,w.
比我想要渲染洞100x100x100网格,所以每个体素和迭代通过该纹理的所有点,计算到我当前体素的距离并将该距离存储在新纹理(1000×1000)中.目前我正在创建的这个纹理只保留颜色贵重物品,它存储红色和绿色组件中的距离,蓝色设置为1.0.
@R_138_9447@在屏幕上看到结果.
我现在的问题是,当我的点云中有大约500 000个点时,似乎在几个体素(小于50 000)之后停止渲染.我的猜测是,如果它需要很长时间,它会停止并只是将它所拥有的缓冲区拉出来.
我不知道是否会出现这种情况,但是如果是这样的话,我可以采取哪些措施来对付它,或者我可以做些什么来使这个程序更好/更快.
我的第二个猜测是,我不会考虑使用1D纹理.但是有更好的方法来传递大量数据吗?因为我肯定需要几十万点数据.
我不知道如果我显示完整的片段着色器是否有帮助,所以我只会显示一些部分,我认为这对于该问题很重要:
距离计算和所有点的迭代:
for(int i = 0; i < points; ++i){ vec4 texInfo = texture(textureImg,getTextCoord(i)); vec4 pos = position; pos.z /= rows*rows; vec4 distVector = texInfo-pos; float dist = sqrt(distVector.x*distVector.x + distVector.y*distVector.y + distVector.z*distVector.z); if(dist < minDist){ minDist = dist; } }
函数getTexCoord:
float getTextCoord(float a) { return (a * 2.0f + 1.0f) / (2.0f * points); }
*编辑:
vec4 newPos = vec4(makeCoord(position.x+Col())-1,makeCoord(position.y+Row())-1,1.0); float makeCoord(float a){ return (a/rows)*2; } int Col(){ float a = mod(position.z,rows); return int(a); } int Row() { float a = position.z/rows; return int(a); }
最典型的值列于here和here.
>如果您真的必须在frag着色器中使用大量数据,请考虑具有已知2维度和GL_NEAREST / GL_REPEAT坐标的2D或3D纹理.这将使您能够计算2D纹理坐标,只需将源偏移乘以预先计算的1 /宽度值(Y坐标;其余的定义小于1个纹素,并且可以在GL_NEAREST存在时安全地忽略)并将其用作-is for X coord(GL_REPEAT保证只使用其余部分).我个人在需要将128 MB数据传递给GLSL 1.20着色器时实现了这种方法.
>如果您的目标是最近的OpenGL(≥3.0),您也可以使用buffer textures.>最后,但并非最不重要.您不能通过标准IEEE浮点数传递大于224的整数精度值.
以上是大佬教程为你收集整理的c – GLSL停止渲染全部内容,希望文章能够帮你解决c – GLSL停止渲染所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。