编辑:对于实时绘图,在opengl和opencl之间的“互用性”中开始使用基于jmonkeyengine和jocl的lwjgl,现在可以实时计算和绘制10万个粒子。 也许地狱版本的Jmonkey引擎可以治愈这个drawcall开销问题。 几天来,我一直在Eclipse(java 64位)学习jMonkey引擎(ver:3.0),并尝试使用GeometryBatchFactory.optimize(rootNode);优化场景GeometryBatchFactory.optimize(rootNode); 命令。 没有优化(具有改变球体位置的能力): 好的,只有1-fps源于pci-express带宽+ jvm开销。 通过优化(无法改变球体的位置): 现在即使增加三angular形数字也是29 fps。 Java3D有一个setCapability()方法,它使得一个场景对象能够被优化的forms读写。 jMonkey引擎3.0必须能够这个主题,但我找不到任何痕迹(search教程和示例,失败)。 问题:如何在jMonkey 3.0中设置场景optimized节点的read/write position/rotation/scalefunction? 如果你不能回答第一个问题,你能告诉我为什么我使用优化命令时三angular形数字增加了吗? 我必须创build一个新的方法来访问graphics卡,并自己改变variables(jogl也许?)? 场景信息:16k粒子(16×16分辨率的球体)+ 1分光线(及其4096分辨率的阴影)。 我相信我们可以轻松地通过pci-express在毫秒内发送几千个浮点数。 附加信息:我使用Aparapi-kernels更新粒子位置需要10毫秒(16k * 16k交互来计算力量)(不会改变任何东西在优化模式:()可以aparapi访问这些优化的数据? 对于batchNode.batch(); 优化,这里是1 fps又减less对象数字: 对象数目现在只有几百,但fps仍然在1! 只发送球体位置到GPU,并让它计算顶点位置可能比计算CPU上的顶点,加上巨大的数据发送到CPU更好。 没有人在这里帮忙? 已经尝试过batchNode,但没有足够的帮助。 我不想改变3D API,因为JMonkey人已经改造了车轮,我很满意目前的情况。 只是试图挤一点点的performance(取消阴影提供了百分之百的速度,但质量也很重要!)。 这个Java程序将成为一个小行星撞击现场模拟器(将有select的小行星的大小,质量,速度,angular度)与行进立方体algorithm与LOD(将数百万颗粒)。 Marching-cubesalgorithm会大大减less三angular形数量。 如果你不能给出任何答案的问题,任何行军立方体(或任何O(n)凸包)algorithm的Java将被接受! 数据:x,y,zarrays为源,三angular形条阵为目标(等值面网格点) 谢谢。 以下是一些有关stream的示例(分辨率低得多): 1)由引力引起的立方体形岩体的塌陷: 2)排斥力开始显现出来: 3)排斥力+引力使组形成更加光滑的形状: 4)组形成一个球体(如预期): 5)然后,一个巨大的星体接近: 6)关于触摸: 7)影响的时刻: 在Barnes-Huttalgorithm和截断势能的帮助下,粒子数量将会增加10倍(也许是100倍)。 而不是Marching-Cubesalgorithm,包装nbody的鬼布料可以给出低分辨率的船体(比BH更容易,但需要更多的计算) 鬼布会受nbody影响(重力+排斥),但是nbody不会受到缠绕布料的影响。 Nbody不会被渲染,但布网将被渲染与较低的triange数。 如果MC或以上的工作,这将使程序渲染约200倍的粒子的包装布。
在OpenGL初始化过程中,程序应该执行如下操作: <Get Shader Source Code> <Create Shader> <Attach Source Code To Shader> <Compile Shader> 获取源代码可以像把它放在一个string一样简单:(例子取自SuperBible,第6版 ) static const char * vs_source[] = { "#version 420 core \n" " \n" "void main(void) \n" "{ \n" " gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n" "} \n" }; 问题在于很难直接在string中编辑,debugging和维护GLSL着色器。 因此,从文件中获取源代码string更容易进行开发: std::ifstream vertexShaderFile("vertex.glsl"); std::ostringstream vertexBuffer; vertexBuffer << vertexShaderFile.rdbuf(); std::string […]
我想获得一个着色器程序对象使用的所有制服和属性列表。 glGetAttribLocation()和glGetUniformLocation()可以用来映射一个string到一个位置,但我真正喜欢的是string列表,而不必分析glsl代码。 注意:在OpenGL 2.0中, glGetObjectParameteriv()被glGetObjectParameteriv()所取代。 枚举是GL_ACTIVE_UNIFORMS & GL_ACTIVE_ATTRIBUTES 。
我正在尝试使用opengl / directx或GDI制作animation的Windows 7壁纸。 我研究了Windows桌面窗口是如何布置的,我想到了整个 “Progman” – >“SHELLDLL_DefView” – >“SysListView32” 层次结构。 我试图挂钩SysListView32的WndProc,并尝试使用注入的C#DLL消息,所以我可以防止桌面绘制墙纸,当我强迫它改变使用控制面板 – >个性化菜单。 这没有一个实际上阻止了壁纸的更新,所以我认为explorer.exe实际上并不处理绘制壁纸。 为了证实这一点,我杀了explorer.exe,并设置了一个小小的c#程序,将10秒定时器的壁纸更改为随机的。 正如我所料,壁纸不断变化,导致我相信explorer.exe实际上不处理壁纸的绘制! 不幸的是,这是我完全失去了。 我不知道还有什么是负责绘制壁纸,我怎么可以接pipe它的绘图,所以我可以处理绘图。 我试图谷歌这几天,现在几乎没有进展。 我希望这里有人能指引我走向正确的方向。
你知道任何一个积极开发的C / C ++库,它可以把一堆(最好是大量的)4D顶点,投射到三维空间,相对于一些任意的“四维摄像机”投影matrix,并输出规则的三维顶点我可以提供给OpenGL硬件加速可视化? 我还需要能够在4D空间执行标准转换(平移,沿着所有4个轴的旋转和均匀缩放)。
我正在用GLSL着色器编码一个小的渲染引擎: 每个Mesh(well,submesh)都有一个顶点stream(例如,position,normal,texture,tangent等)到一个大的VBO和一个MaterialID中。 每种材质都有一组纹理和属性(例如镜面颜色,漫reflection颜色,颜色纹理,法线贴图等) 然后我有一个GLSL着色器,它是制服和属性。 我们说: uniform vec3 DiffuseColor; uniform sampler2D NormalMapTexture; attribute vec3 Position; attribute vec2 TexCoord; 我试图为GLSL着色器devise一种方法来定义属性和制服的stream映射(语义),然后将顶点stream绑定到适当的属性。 对网格说:“把你的位置stream属性”位置“和你的tex坐标在”TexCoord“。也把你的材料的漫reflection颜色在”DiffuseColor“和你的材料的第二个纹理”NormalMapTexture“ 目前,我正在使用硬编码名称的属性(即顶点pos始终是“位置”等),并检查每个统一和属性名称,以了解着色器正在使用它。 我想我正在寻找创build“顶点声明”的方法,但也包括制服和纹理。 所以我只是想知道人们是如何在大型渲染引擎中这样做的。 编辑: build议的方法回顾: 1.属性/统一语义由variables的名称给出 (我现在在做什么)为每个可能的属性使用预定义的名称.GLSL活页夹将查询每个属性的名称,并根据variables名称: //global static variable semantics (name,normalize,offset) = {"Position",false,0} {"Normal",true,1},{"TextureUV,false,2} …when linking for (int index=0;index<allAttribs;index++) { glGetActiveAttrib(program,index,bufSize,length,size[index],type[index],name); semantics[index]= GetSemanticsFromGlobalHardCodedList(name); } … when binding vertex arrays for render for (int index=0;index<allAttribs;index++) { […]
经过多年的关于顶点缓冲区对象(VBOs)的听取,我终于决定尝试一下(我的东西通常不是性能的关键,显然…) 我将在下面描述我的实验,但是为了简单起见,我在“简单”直接模式(glBegin()/ glEnd()),顶点数组(CPU端)和VBO(GPU端)之间看到了难以区分的性能,渲染模式。 我想明白为什么会这样,在什么样的条件下,我可以期望看到维也纳各组织显着地超越了他们原始的双关语的祖先。 实验细节 对于实验,我生成了大量点的(静态)三维高斯云。 每个点都有与之相关的顶点和颜色信息。 然后,我以相当的“轨道”行为在相继的帧中围绕云端旋转相机。 再次,点是静态的,只有眼睛移动(通过gluLookAt())。 数据在任何渲染之前生成一次,并存储在两个数组中以用于渲染循环。 对于直接渲染,整个数据集呈现在单个glBegin()/ glEnd()块中,每个glColor3fv()和glVertex3fv()都包含一个单独的调用。 对于顶点数组和VBO渲染,整个数据集都是用一个glDrawArrays()调用渲染的。 然后,我简单地运行一分钟左右,然后用高性能定时器测量平均FPS。 性能结果## 如上所述,我的台式机(XP x64,8GB RAM,512 MB Quadro 1700)和我的笔记本电脑(XP32,4GB RAM,256 MB Quadro NVS 110)的性能无法区分。 然而,它的确按照预期的分数进行了缩放。 显然,我也禁用了vsync。 笔记本电脑运行的具体结果(呈现w / GL_POINTS): 在glBegin()/ glEnd(): 1K点 – > 603 FPS 10K – > 401 FPS 100K – > 97 FPS 1M点 – > 14 FPS 顶点数组(CPU端): 1K点 […]
哪个更好 ? 要有一个着色器程序有很多制服指定要使用的灯光或映射(例如,我需要一个网格是视差映射,另一个视差/镜面映射)。 如果需要的话,我会制作一个caching的制服清单,然后为每一个下一个网格制作一些制服。 为了每个需要的情况都有很多的着色器程序 ,每一个都有less量的制服,如果需要的话,为每个网格做glUseProgram的惰性绑定。 在这里,我假定网格是正确的批处理,以避免冗余交换机。
我有一个校准摄像机(固有的matrix和失真系数),我想知道相机的位置知道一些3d点和它们在图像中的相应点(2d点)。 我知道cv::solvePnP可以帮助我,读完这个后 ,我明白了solvePnP rvec和tvec的输出是摄像机坐标系中对象的旋转和平移。 所以我需要找出世界坐标系下的相机旋转/平移。 从上面的链接看来,代码很简单,在python中: found,rvec,tvec = cv2.solvePnP(object_3d_points, object_2d_points, camera_matrix, dist_coefs) rotM = cv2.Rodrigues(rvec)[0] cameraPosition = -np.matrix(rotM).T * np.matrix(tvec) 我不知道Python / numpy的东西(我正在使用C ++),但是这对我来说并没有什么意义: rvec,solvePnP的tvec输出是3x1matrix,3个元素的向量 cv2.Rodrigues(rvec)是一个3x3matrix cv2.Rodrigues(rvec)[0]是一个3x1matrix,3个元素向量 cameraPosition是一个3×1 * 1x3matrix乘法,即一个.. 3x3matrix。 我怎么可以在opengl中使用简单的glTranslatef和glRotate调用?
作为3D优化的一部分,我需要将三angular形合理地包装到一个盒子中(我正在将不同材质的片段填充到一个单独的纹理中,用于深度分类,所以纹理不会切换与每一个新的三) 有没有一个algorithm来做到这一点? 三angular形本身可以制作成可以(可变形为正确的angular度,有效地使这个盒子填充algorithm,而不是),但我想避免这一点,如果可能的话,因为它会扭曲底层的纹理艺术。