我正在编写一个OpenGL使用的简单应用程序GLUT.我不想滚动自己的字体渲染代码,而是想使用附带的简单位图字体GLUT.让他们工作的步骤是什么?
我已经获得了一个带有x和y坐标的2D三角形的结构,一个旋转变量,等等.从那些x和y坐标创建的点,我应该在点周围绘制一个三角形并使用旋转变量适当地旋转它.
我熟悉使用GL_TRIANGLES在OpenGl中绘制三角形.我的问题是以某种方式提取三角形的中间并在其周围绘制顶点.
编辑:是的,我要找的是质心.
我开始学习3D渲染,我一直在取得很好的进展.我已经了解了很多关于矩阵和可以在它们上执行的一般操作.
我还没有完全关注的一件事是OpenGL使用矩阵.我看到这个(以及类似的东西)相当多:
x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Run Code Online (Sandbox Code Playgroud)
所以我最好的理解是,它是一个标准化(无量级)的4维列主矩阵.此外,该矩阵特别称为"单位矩阵".
一些问题:
我最大的困惑来自于OpenGL如何利用这种数据.
我有一个程序模拟随时间变化的物理系统.我希望以预定的间隔(例如每10秒)输出模拟状态到文件的可视化.我想以这样的方式做到这一点,即很容易"关闭可视化"而根本不输出可视化.
我正在将OpenGL和GLUT作为图形工具来进行可视化.然而问题似乎是,首先,它看起来只是输出到窗口而无法输出到文件.其次,为了生成可视化,您必须调用GLUTMainLoop并停止执行main函数 - 从那时起调用的唯一函数是来自GUI的调用.但是我不希望这是一个基于GUI的应用程序 - 我希望它只是一个从命令行运行的应用程序,它会生成一系列图像.有没有办法在GLUT/OpenGL中执行此操作?或者OpenGL完全是错误的工具,我应该使用别的东西
在OpenGL中,我可以通过正常绘制对象来绘制对象,然后使用模板缓冲区再次将其绘制为线框,这样就不会绘制原始对象.但是,这会产生一种纯色的轮廓.
在此图像中,生物轮廓的像素似乎比它们勾勒出的生物更加透明.如何使用OpenGL实现类似的效果?
这是我目前的设置:我正在使用SDL进行OpenGL渲染(目前在Linux上).我初始化SDL(SDL_Init)并SDL_CreateWindow在主线程中创建应用程序窗口()并将其传递给第二个线程.第二个线程从it(SDL_GL_CreateContext)创建一个OpenGL上下文并启动一个渲染循环,而主线程侦听事件.我认为重要的是要注意GL调用完全局限于第二个线程; 实际上我的大多数应用程序逻辑都在那里发生,主线程实际上只负责处理通过SDL传入的事件.
最初我反过来做了这个,但事实证明你不能处理除了OSX上的主线程以及可能还有Windows之外的任何事件,所以我将其切换为将来兼容这两个.
我是否有任何担心这不适用于OSX/Windows?在Linux上,我没有任何东西.互联网上有很多关于上下文共享和从多个线程进行GL调用的信息,但我想要做的就是在一个不是主线程的线程中做OpenGL.我不想继续编写我的应用程序编码,以后发现它不会在其他地方工作.
我读过API之类的glDrawElementsIndirect,glDrawArraysIndirect帮助我们进行间接渲染.间接渲染不同于直接渲染参数,如"顶点属性数","绘制实例数","从缓冲区对象开始顶点属性"等由GPU本身在缓冲区对象中提供而不是直接渲染由绘图调用中的CPU提供.
我明白.它还解释了它的优点是它可以更快地渲染,因为不涉及CPU交互.但是等等,是不是实际进行渲染调用的CPU?它仍然指定了渲染模式(GL_TRIANGLES等).它也可能加载了顶点属性.
那么,间接渲染中的所有穿孔增益都是通过不必传递这些微小变量来解释的:"计数","原始计数","第一顶点属性","实例计数"?这对我来说没什么意义.(它也没有改变任何状态)
创建在显示器上渲染像素的GPU驱动程序需要执行哪些步骤?基本上只是创建GPU驱动程序的最简单的"hello world"示例,例如将屏幕变为红色或仅显示单个像素.你从哪里开始的?
我想直接破解GPU,没有任何C或OpenGL抽象或任何.我使用的是Mac OSX,我认为我有Intel HD i7显卡,所以这些文档似乎很合适:
Mesa3D项目表示有许多开源图形驱动程序,维基百科说英特尔会生成这些文档,以便您可以根据需要编写开源驱动程序,但不解释如何.
我还遇到了Michael Abrash的图形编程黑皮书,它解释了很多.
然而,这有点太多了.似乎没有任何关于如何开始攻击GPU驱动程序的信息,这是一个"hello world"项目.
例如:
brew install nasm编写一些汇编,编译并运行它来打印"hello world".你如何为显卡做同样的事情?
你好世界的例子不一定非常有效(尽管如果它确实会很酷!); 即使仅仅概述一下更高层次/实际意义上的内容也会有所帮助.如果在Mac上,甚至在Linux上都无法实现,那就不错了.但即使这样,问题仍然存在,你从哪里开始编写图形驱动程序?
在64位Ubuntu 14.04 LTS上,我正在尝试编译一个使用过剩的简单OpenGL程序.我在main中执行任何代码行之前得到了一个Segmentation Fault(SIGSEV); 即使是在一个非常简单的测试计划上.什么可能导致这个?
我的命令行:
g ++ -Wall -g main.cpp -lglut -lGL -lGLU -o main
我的简单测试案例:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <string>
#include <cstdio>
int main(int argc, char** argv){
printf("Started\n");
std::string dummy = "hello";
glutInit(&argc, argv);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,main开头的printf不会在segfault之前执行.在GDB下,我在segfault之后得到了这个回溯
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff3488291 in init () at dlerror.c:177
#2 0x00007ffff34886d7 in _dlerror_run (operate=operate@entry=0x7ffff3488130 <dlsym_doit>, args=args@entry=0x7fffffffddf0) at dlerror.c:129
#3 0x00007ffff3488198 in __dlsym (handle=<optimized out>, name=<optimized out>) at dlsym.c:70
#4 0x00007ffff702628e in ?? () from …Run Code Online (Sandbox Code Playgroud) 我目前正在处理分层场景图中的节点,并且我难以相对于特定的转换空间(例如父节点)正确地转换/旋转节点.
如何在场景图中相对于其父节点正确平移/旋转节点?
考虑以下水分子图(没有连接线)用于场景节点的父/子结构,其中O xygen原子是父节点,2 H ydrogen原子是子节点.
如果您抓住父O xygen原子并翻译结构,您希望H ydrogen儿童跟随并保持与父母相同的相对位置.如果你抓住一个孩子H原子并翻译它,那么只有孩子会受到影响.这通常是它目前的工作方式.当O原子被翻译时,H原子会随着它自动移动,正如层次图所预期的那样.
然而,当翻译父母时,孩子们最终还会积累额外的翻译,这实际上会导致孩子们在同一个方向"翻译两次"并远离他们的父母而不是保持相同的相对距离.
如果您抓住父O节点并旋转它,您希望子节点H节点也旋转,但在轨道中,因为旋转正由父节点执行.这按预期工作.
但是,如果你抓住一个子H节点并告诉它相对于它的父节点旋转,我预计只有孩子会以同样的方式绕其父节点绕轨道运行,但这不会发生.相反,孩子在其当前位置以更快的速度(例如,相对于其自身局部空间旋转的两倍)在其自身轴上旋转.
我真的希望这个描述足够公平,但如果不是,请告诉我,我会根据需要澄清.
我使用4×4 列优先矩阵(即Matrix4)和列向量(即Vector3,Vector4).
下面不正确的逻辑是我最接近正确的行为.请注意,我选择使用Java的像语法,运算符重载,使数学更容易在这里找到.当我以为我已经把它想出来的时候,我尝试了不同的东西,但我真的没有.
translate(Vector3 tv /* translation vector */, TransformSpace relativeTo):
switch (relativeTo):
case LOCAL:
localTranslation = localTranslation * TranslationMatrix4(tv);
break;
case PARENT:
if parentNode != null:
localTranslation = parentNode.worldTranslation …Run Code Online (Sandbox Code Playgroud)