所有的问候,
我正在寻找轻量级(少量文件或只有头文件)的数学库,用于OpenGL(C++)做矩阵运算(矩阵向量乘法,计算逆矩阵).
有什么建议 ?
我需要从立方体计算6个面的法线.使用键移动立方体,因此,当立方体的位置需要知道正常面部时.
有什么方法可以帮助这个计算?
我从这里读到的一些内容说使用GLUT被认为是不专业的.Swiftless有相当多的教程,我认为他是NeHe中的"转到OpenGL示例和教程".我在一些项目中使用了多种语言的GLUT,但主要用于学校项目.我发现使用它制作跨平台的OpenGL应用程序非常容易.
使用GLUT不专业吗?如果是这样的话?
在堆栈上创建的数组的内容是什么,但没有放入值?像这样:
int array[4]
cout << array[2];
Run Code Online (Sandbox Code Playgroud)
我问这个是因为我在OpenGL中总是看到生成纹理时,它是这样做的:
GLuint textures[4];
glGenTextures(4, &textures[0]);
glBindTexture(GL_TEXTURE_2D, textures[2]);
Run Code Online (Sandbox Code Playgroud)
这有什么关系?
谢谢.
我有一个加载纹理的函数,并返回新生成的GLuint.如果它无法加载纹理,我需要知道应该返回什么.因此,如果glGenTextures开始在1处分配纹理ID,我可以返回GL_FALSE等.
我试图在彩色四边形上方绘制一个部分透明的纹理,以便颜色透过透明部分,形成轮廓.这是代码:
// Setup
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
// (...)
// Get image bits in object 't'
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
// (...)
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// Underlying coloured quad
glColor4d(0.0, 1.0, 0.0, 1.0);
glBindTexture(GL_TEXTURE_2D, 0);
glBegin(GL_QUADS);
glVertex3d(coords11.first, coords11.second, -0.001);
glVertex3d(coords12.first, coords12.second, -0.001);
glVertex3d(coords21.first, coords21.second, -0.001);
glVertex3d(coords22.first, coords22.second, -0.001);
glEnd();
// Textured quad
glColor4d(1.0, 1.0, 1.0, 0.5);
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0); …Run Code Online (Sandbox Code Playgroud) 我正在制作一个OpenGL应用程序,但是我收到了一条EXC_BAD_ACCESS消息.
这是我的代码:
//(draw function only, ask if you need more)
//objects: array of triangles/quads
//Triangle/Quad3D: should be obvious, I like OOP
//PS this is in a 'Composite Object' class
- (void)draw {
//NSLog(@"%@",objects);
NSMutableArray *quad, *tri;
quad = [NSMutableArray arrayWithCapacity:0];
tri = [NSMutableArray arrayWithCapacity:0];
NSEnumerator *e = [objects objectEnumerator];
id object;
while (object = [e nextObject]) {
if ([object isKindOfClass:[Triangle3D class]]) {
[tri addObject:(Triangle3D *)object];
} else if ([object isKindOfClass:[Quad3D class]]) {
[quad addObject:(Quad3D *)object];
}
}
NSLog(@"%d",[tri count]);
NSLog(@"%d",[quad …Run Code Online (Sandbox Code Playgroud) 我试图将图像纹理映射到单个多边形.我的图像正在被正确读取,但只有图像的红色平面被纹理化.
我在QGLWidget中这样做
我在读完后检查了图像,并且正在正确读取组件 - 即,我得到绿色和蓝色平面的有效值.
这是代码
QImageReader *theReader = new QImageReader();
theReader->setFileName(imageFileName);
QImage theImageRead = theReader->read();
if(theImageRead.isNull())
{
validTile = NOT_VALID_IMAGE_FILE;
return;
}
else
{
int newW = 1;
int newH = 1;
while(newW < theImageRead.width())
{
newW *= 2;
}
while(newH < theImageRead.height())
{
newH *= 2;
}
theImageRead = theImageRead.scaled(newW, newH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
// values checked in theImageRead are OK here
glGenTextures(1,&textureObject);
theTextureImage = QGLWidget::convertToGLFormat(theImageRead);
// values checked in theTextureImage are OK here
glBindTexture(GL_TEXTURE_2D, textureObject);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,newW, newH, 0, …Run Code Online (Sandbox Code Playgroud) 所以我正在学习OpenGL作为主要资源的"红皮书".我正在阅读矩阵代数,旋转/缩放/变换矩阵,一切都很好,但我只是没有一个简单的事情.假设函数glLoadIdentity().它设置默认矩阵4x4.因此它设置3个顶点和1个点:(1,0,0)(0,1,0)(0,0,1)个顶点,(0,0,0)个点.但我的问题是,这些对应的是什么?一般来说,OpenGL中矩阵对应的是什么?我知道这些是轴心的方向.但是什么呢?相机?
在游戏中我们的互联网组装团队正在编程,我们假设我们的观众中的每个人都将在游戏中获得全速.
因此,为了节省视频RAM,并希望为显卡提供更多的空闲时间,使用没有双缓冲的V-sync将是我们的最佳选择.因此,在OpenGL中,我们需要知道如何做到这一点.
根据我的理解,V-sync是指图形卡在完成渲染单帧后暂停,直到该帧完成发送到显示设备.双缓冲不会暂停渲染操作(或者可能是暂停渲染操作,或者可能是特定于实现;不确定),因为它会在复制到帧缓冲区之前绘制到第二个缓冲区,以便监视器获得完整帧或不根本就是新帧(具体来说,是帧缓冲区中最后存储的图像).好吧,我们不需要这个功能,只要显卡只是在它需要时才写入帧缓冲区.
这是一个非常慢的在线游戏(但它非常有创意^ _ ^).实时行动非常少.因此,非常精确的用户输入不是必需的; 它可以在渲染帧之前随时从OS捕获为单个单元.
所以,为了做到这一点,我需要能够从OpenGL获得"Frame已经完成发送到监视器"的消息.可能吗?如果没有,最好的选择是什么?
该游戏目前仅针对Windows编程,但应该在几个月内完成Linux的工作.