我想在Ubuntu中安装VTK.CMake发给我这个错误:
/usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108中的CMake错误(消息):找不到OpenGL(缺少:OPENGL_gl_LIBRARY OPENGL_INCLUDE_DIR)调用堆栈(最近一次调用):/
usr/share/cmake-2.8 /Modules/FindPackageHandleStandardArgs.cmake:315(_FPHSA_FAILURE_MESSAGE)/usr/share/cmake-2.8/Modules/FindOpenGL.cmake:161(FIND_PACKAGE_HANDLE_STANDARD_ARGS
)
渲染/ OpenGL/CMakeLists.txt:196(find_package)CMake错误:此项目中使用以下变量,但它们设置为NOTFOUND.请设置它们或确保它们在CMake文件中正确设置和测试:OPENGL_INCLUDE_DIR(ADVANCED)用作目录/home/pilou/Documents/src/VTK-6.2.0/Geovis/Core中的包含目录
因此我安装了freeglut3和build-essential(正如我在互联网上看到的那样).但一切都没有改变.
我怎么能找到opengl写我自己的链接到CMake?我还能做些什么来安装VTK?
我一直在Windows上使用OpenGL扩展这种痛苦的方式.GLEW是更容易的方式吗?我该如何开始使用它?
标准模型是OpenGL用于专业应用程序(CAD),Direct3D用于游戏.
随着openGL 3.0的崩溃,openGl仍然是技术3D应用程序(cad/GIS)的自然选择吗?
是否有Direct3D的场景图库?
(当然Direct3D只是windows.)
我理解GTK,QT或其他图形工具包的目的.但我不明白OpenGL的作用.它只是另一个GUI库还是指更基本的东西?如果是这样,它是什么以及何时应该在日常黑客中使用它?
我一直试图找到有关在图形硬件上使用float vs double的性能的信息.我已经在CPU上找到了关于float vs double的大量信息,但是GPU的这种信息更加稀缺.
我使用OpenGL进行编码,因此,如果您认为应该知道该API的任何特定信息,那就让我们了解一下.
我知道如果程序将大量数据移入/移出图形硬件,那么使用浮点数可能会更好,因为双倍需要两倍的带宽.我的询问更多的是图形硬件如何处理它.据我所知,现代英特尔CPU将浮点/双精度转换为80位实数进行计算(不包括SSE指令),因此这两种类型的速度同样快.现代显卡做这样的事吗?浮动和双重表现现在大致相等?是否有任何强有力的理由使用一个而不是另一个?
我有一些二维几何.我想在我的几何体周围采用一些边界矩形,然后在平面上的其他地方渲染一个较小的版本.这里或多或少是我必须进行缩放和翻译的代码:
// source and dest are arbitrary rectangles.
float scaleX = dest.width / source.width;
float scaleY = dest.height / source.height;
float translateX = dest.x - source.x;
float translateY = dest.y - source.y;
glScalef(scaleX, scaleY, 0.0);
glTranslatef(translateX, translateY, 0.0);
// Draw geometry in question with its normal verts.
Run Code Online (Sandbox Code Playgroud)
当dest原点为0时,这与给定维度的预期完全一样.但是,如果x的原点非零,则结果仍然正确缩放但看起来像(?)它被转换为该轴上接近零的值无论如何 - 事实证明它与dest.x为零并不完全相同.
有人能指出一些我不知道的明显事物吗?
谢谢!
最终更新根据下面的Bahbar和Marcus的答案,我做了一些实验并解决了这个问题.亚当鲍文的评论是提示.我错过了两个重要的事实:
回想起来,第一种是显而易见的.但对于后者,对于像我这样的其他优秀程序员/坏数学家:原来我的直觉是在红皮书所谓的"大型,固定坐标系统"中运行,其中有一个绝对平面,你的几何形状在四处移动那架飞机使用变形.这是可以的,但考虑到将多个变换堆叠成一个矩阵背后的数学性质,它与事物真正起作用的方式相反(请参阅下面的答案或红皮书了解更多信息).基本上,变换以"相反的顺序""应用"它们在代码中的出现方式.这是最终的工作解决方案:
// source and dest are arbitrary rectangles.
float scaleX = dest.width / source.width;
float scaleY = dest.height / source.height;
Point sourceCenter …Run Code Online (Sandbox Code Playgroud) Consider this the complete form of the question in the title: Since OpenCL may be the common standard for serious GPU programming in the future (among other devices programming), why not when programming for OpenGL - in a future-proof way - utilize all GPU operations on OpenCL? That way you get the advantages of GLSL, without its programmatic limitations.
我已经看过很多关于这个主题的材料,但是我发现的例子之间存在一些差异,而且我很难深入了解正确的过程.希望有人可以告诉我,如果我走在正确的轨道上.我还应该提到我在OS X Snow Leopard和最新版本的Xcode 3上做这个.
举个例子,假设我想写两个目标,一个用于普通,一个用于颜色.为此,我创建了一个帧缓冲区并将两个纹理绑定到它,以及深度纹理:
glGenFramebuffersEXT(1, &mFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
glGenTextures(1, &mTexColor);
glBindTexture(GL_TEXTURE_2D, mTexColor);
//<texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0);
glGenTextures(1, &mTexNormal);
glBindTexture(GL_TEXTURE_2D, mTexNormal);
//<Texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0);
glGenTextures(1, &mTexDepth);
glBindTexture(GL_TEXTURE_2D, mTexDepth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)
Run Code Online (Sandbox Code Playgroud)
在渲染之前,我会再次绑定帧缓冲,然后执行:
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(2, buffers); …Run Code Online (Sandbox Code Playgroud) 我看了一下GtkGlExt,但它只适用于GTK2.不幸的是,经过几个小时的搜索,似乎没有人会像OpenGLDrawingArea那样照顾...
任何信息都将受到欢迎.即使它像"现在不可能".
我正在使用OpenGL编写一个小图形引擎(通过带有C#的OpenTK).
为了定义顶点属性,我有一个VertexDeclaration类,其中包含一个VertexElement结构数组,这些结构映射到glEnableVertexAttribArray/glVertexAttribPointer调用.
此外,为了支持多个顶点流,我有一个特殊的结构,包含顶点缓冲区,顶点声明,顶点偏移和实例频率(如XNA的VertexBufferBinding结构).
目前,每当调用一个绘图调用时,我迭代所有设置的顶点流并绑定它们的顶点缓冲区,应用顶点声明,禁用未使用的顶点属性并绘制基元.
我想使用VAO将glEnableVertexAttribArray调用缓存到它们中,并且每当应用顶点流时,绑定VAO并更改其数组缓冲区绑定.
这是VAO的正确用法吗?