我注意到当我渲染一个简单的图元时,就像旋转的立方体一样,我将每个角度增加0.1,然后通过传统的while(!done)循环,这是我在垂直同步开启时的结果与关闭时的结果(如在我的nVidia控制面板中改变了)在速度方面有很大的不同.
例如,我使用以下代码:
while (!done)
{
PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT)
{
done = true;
}
else
{
angle += 0.1;
if (angle >= 360.0)
{
angle = 0.0;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glPushMatrix();
glRotatef(angle, 1.0f, 0.0f, 0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidCube(2.0f);
glPopMatrix();
glFlush();
SwapBuffers(hDC);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Run Code Online (Sandbox Code Playgroud)
当强制关闭垂直同步时,此立方体旋转的速度比强制垂直同步时快得多.现在,在游戏中,当启用垂直同步时,FPS锁定为60 fps,并且当禁用时,可以自由跳转到显示器允许的最高值.这可能与它有关.
我可以通过每次传递增加或减少我的角度来轻松解决这个问题,有没有办法让我的立方体以相同的方式旋转,尽管vsync开启或关闭?
我正在编写一个C++程序来为一组点生成三次样条轨迹.这些点不需要沿x轴排序.例如,它可能是一个圆圈等.
我在网上找到了一些库,例如,ALGLIB库或这里的类https://www.marcusbannerman.co.uk/index.php/home/42-articles/96-cubic-spline-class.html,但所有这些库都对数据点进行排序.我不需要这个,因为我想要生成的东西就像一个圆圈.反正有没有实现这个目标?
是否可以在不声明曲面法线的情况下声明对象上的光照?
我愿意做的步骤是:
1. enable lighting
2. define surface material
3. define lighting position
4. define lighting parms : ambient....
Run Code Online (Sandbox Code Playgroud)
这还不够,还是我必须放在哪里呢?
我知道openGL用于游戏,但是可以在Android Views等东西上使用OpenGL吗?例如,单击按钮将导致按钮(使用OpenGL爆炸/跳舞/ etc/etc).
我需要将一个大的3D整数数组保存到一个文件中,然后再用C++加载它.它是256*256*256 = 16777216个整数.
保存并再次加载它的最佳方法是什么?我最感兴趣的是快速加载时间.
我使用GLMmodel对象来表示C++程序中的Google Sketch Up模型.这些对象有一个成员(顶点),其中包含对象的所有顶点的列表,如下所示:[GLfloat x顶点1的组件,顶点1的GLfloat y组件,顶点1的GLfloat z组件,GLfloat x组件顶点2 ...].当我读取所有这些值时,我得到所有这些值的小数字,除了前三个(第一个顶点的坐标),它们都是三个-431602080.000000.这在我的程序中没有意义.我用谷歌搜索了它,我发现这个值经常出现在C++程序中,但我不知道它是什么意思.有任何想法吗?
我的程序的目的是加载和显示每个面上具有相同纹理的简单立方体.但问题是输出不是很好(只有4个面被正确纹理化).我在纹理数组中尝试了很多坐标组合,但大多数情况下它更糟糕.是否可以使用glDrawElements函数正确设置纹理?
#define OFFSET_BUFFER(bytes) ((GLfloat *)NULL + bytes)
GLfloat vertices[] =
{
-1.0, -1.0, -1.0,
1.0, -1.0, -1.0,
1.0, 1.0, -1.0,
-1.0, 1.0, -1.0,
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, 1.0, 1.0,
};
GLubyte indices[] =
{
0, 1, 2, 3,
4, 7, 6, 5,
0, 4, 5, 1,
3, 2, 6, 7,
0, 3, 7, 4,
1, 5, 6, 2
};
GLfloat textures[] =
{
0,0, 1,0, 1,1, 0,1,
0,1, 1,1, 1,0, 0,0,
/*//0,0, 1,0, 1,1, …Run Code Online (Sandbox Code Playgroud) 我正在制作一些游戏,而且我已经完成了所有游戏,但并没有放大枪的能力,因为我不知道如何设置它.游戏是使用openGL在3D中完成的,所以我想听听你关于如何实现它的建议.如果需要,可以提供代码的片段.
我的引擎中有多个纹理后遇到问题.
我的渲染代码目前看起来像这样:
void Renderer::render() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
checkGlError("glClear");
for (vector<Node*>::const_iterator it = renderArray_.begin(); it != renderArray_.end();
it++) {
Node* node = *it;
EntityModel* entity =
static_cast<EntityModel*>(resourceManager_->getResource(
(*it)->getEntity()));
if (entity == 0 || entity->getVertices() == 0 || entity->getVertices()->size() == 0) {
LOGI("Empty entity %s.", node->getName().c_str());
continue;
}
Resource* resource = resourceManager_->getResource(node->getShader());
Shader* shader = static_cast<Shader*>(resource);
Resource* resource2 = resourceManager_->getResource(entity->getTexture());
Image* image = static_cast<Image*>(resource2);
mat4 proj;
Matrix::projection3D(proj, 45.0f,
(float) nScreenWidth_ / nScreenHeight_, 0.1f, 100.0f);
mat4 res;
Matrix::multiply(proj, node->getMatrix(), res);
// Select …Run Code Online (Sandbox Code Playgroud)