小编New*_*bie的帖子

glReadPixels()真的很慢,更好的解决方案从鼠标位置获取OpenGL坐标?

这是我用来在3d场景中获取鼠标位置的代码:

void GetOGLPos(int x, int y, GLdouble &pX, GLdouble &pY, GLdouble &pZ){
 GLint viewport[4];
 GLdouble modelview[16];
 GLdouble projection[16];
 GLfloat winX, winY, winZ;

 glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
 glGetDoublev(GL_PROJECTION_MATRIX, projection);
 glGetIntegerv(GL_VIEWPORT, viewport);

 winX = (float)x;
 winY = (float)viewport[3]-(float)y;
 glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

 gluUnProject(winX, winY, winZ, modelview, projection, viewport, &pX, &pY, &pZ);
}
Run Code Online (Sandbox Code Playgroud)

但我注意到一件坏事...每帧1-2次调用该函数会使CPU占用率达到100%,3次或更多次调用200%CPU占用率(我有4个核心,1-2个呼叫= 25%,3个或更多呼叫) = 50%,我认为它不能高于50%...)

有没有其他方法可以有效地做到这一点?我每帧使用4次调用该函数,所以我知道应该为场景渲染哪些区域(我从每个屏幕角落拍摄).

另外我用它来知道我用鼠标指向哪个地方,所以我需要实时,但我想使用更少的CPU,因为即使只有1次调用也会使单核系统的使用率达到100%.

编辑

我已经尝试过glPushName()方法,但它的速度更慢,在我的GPU中比在CPU中更慢.当我在程序中不使用单个glReadPixels()调用时,我的CPU使用率仅为0-1%.奇怪的是,我的CPU使用率很高,但它不会使程序滞后,就像你预期的那样100%使用...当我的程序打开时,只有当我使用其他程序时才出现问题,那么使用它们会有些滞后.

c++ opengl glreadpixels

5
推荐指数
1
解决办法
6584
查看次数

在哪里下载所有需要的 OpenGL 库,包括和编译的 dll 来制作最新的游戏?

是否有任何用于此目的的软件包,一个下载链接?

编辑:现在让 VBO 工作,所以这个问题对我来说没用,我可以接受答案,如果有的话。

c++ windows opengl visual-studio-2008

5
推荐指数
0
解决办法
3万
查看次数

如何在Windows注册表中设置一个值?(C++)

我想将"HKEY_LOCAL_MACHINE\Software\company name\game name\settings\value"键编辑为"1"(DWORD)

这是我的代码:

HKEY hkey;
 DWORD dwDisposition;
 if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\company name\\game name\\settings"), 0, NULL, 0, 0, NULL, &hkey, &dwDisposition) == ERROR_SUCCESS){
  DWORD dwType, dwSize;
  dwType = REG_DWORD;
  dwSize = sizeof(DWORD);
  DWORD rofl = 1;
  RegSetValueEx(hkey, TEXT("value"), 0, dwType, (PBYTE)&rofl, dwSize); // does not create anything
  RegCloseKey(hkey);
 }
Run Code Online (Sandbox Code Playgroud)

但它什么都没做.RegCreateKeyEx()是实际执行某项操作的唯一函数:仅在注册表中创建"文件夹".那又一次如何失败?我如何在注册表中创建"文件"?

c++ registry

4
推荐指数
1
解决办法
1万
查看次数

OpenGL:禁用纹理颜色?

是否可以禁用纹理颜色,并仅使用白色作为颜色?它仍然会读取纹理,所以我不能使用glDisable(GL_TEXTURE_2D),因为我也想渲染alpha通道.

我现在能够想到的是制作新的纹理,其中所有颜色数据都是白色的,保持原样的alpha.

我需要在没有着色器的情况下这样做,所以这甚至可能吗?

编辑:澄清:我想使用两种纹理:白色和普通颜色.

编辑:显然这是不可能的

c++ opengl texture-mapping

4
推荐指数
1
解决办法
3648
查看次数

C++ new&delete和函数

这对我来说有点不清楚......所以,如果我有一个功能:

char *test(int ran){
    char *ret = new char[ran];
    // process...
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

然后多次调用它:

for(int i = 0; i < 100000000; i++){
   char *str = test(rand()%10000000+10000000);
   // process...

   // delete[] str; // do i have to delete it here?
}
Run Code Online (Sandbox Code Playgroud)

所以问题是,我必须delete[]为每次new[]通话使用吗?

c++ new-operator delete-operator

3
推荐指数
2
解决办法
2983
查看次数

C++如何替换一个函数但仍然使用其中的原始函数?

我想修改glBindTexture()函数来跟踪以前绑定的纹理ID.目前我刚为它创建了新功能,但后来我意识到,如果我使用其他使用glBindTexture的代码:那么我的整个系统可能会进入厕所.

那我该怎么办?

编辑:现在,当我想到它,检查我是否应该绑定纹理是没有用的,因为opengl可能已经这样做了.但我仍然需要跟踪以前使用的纹理.

c++ opengl hook windows-xp function

3
推荐指数
1
解决办法
536
查看次数

如何使用"open with"方法获取程序路径?

我有问题,我正在使用我的文件的相对路径,所以当我使用"打开方式"方法打开我的程序中的文件时,我的所有路径都被搞砸了(它将在我使用它的文件夹中创建我的文件"打开"方法."

我怎样才能检索我用来打开文件的.exe文件的完整路径"open with"方法?

编辑:我的主要功能:

int WINAPI WinMain( HINSTANCE   hInstance,          // Instance
                    HINSTANCE   hPrevInstance,      // Previous Instance
                    LPSTR       lpCmdLine,          // Command Line Parameters
                    int         nCmdShow)           // Window Show State
{
Run Code Online (Sandbox Code Playgroud)

c++ windows command-line

2
推荐指数
1
解决办法
1091
查看次数

OpenGL:如何仅更新纹理的一部分?

我不想每次更改它的一小部分时更新整个纹理,这个命令是什么?

当我进行mipmapping时,使用GL_GENERATE_MIPMAP进行设置,内部的优化程度如何?它会再次计算整个图像,还是只更新我的部分?

c++ opengl

1
推荐指数
1
解决办法
299
查看次数

使用哪种方法检查std :: map中是否存在数组键?

我在某些情况下使用以下代码:

#define array_key_exists(find_key, arr) (arr.find(find_key) != arr.end())
Run Code Online (Sandbox Code Playgroud)

但我也只使用这种方法:

if(SomeMap["something"]){
    // key exists
}
Run Code Online (Sandbox Code Playgroud)

我正在使用String to int map.

它们都快吗......?或者假设我没有在地图值中使用零值,第二种情况是否有可能出现错误?到目前为止,第二种情况似乎工作正常.

c++

1
推荐指数
1
解决办法
5754
查看次数

C++:如何包含文件夹中的所有源文件?

我已将每个函数放在自己的文件中.

如何一次性包含所有这些功能而不必手动重复每个文件的#include?我不在乎功能包含在哪个顺序.

编辑:来自数百个不同文件的所有功能属于同一组.实际上每个文件有4个功能......

c++ include visual-studio-2008

1
推荐指数
1
解决办法
3663
查看次数