这是我用来在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%使用...当我的程序打开时,只有当我使用其他程序时才出现问题,那么使用它们会有些滞后.
是否有任何用于此目的的软件包,一个下载链接?
编辑:现在让 VBO 工作,所以这个问题对我来说没用,我可以接受答案,如果有的话。
我想将"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()是实际执行某项操作的唯一函数:仅在注册表中创建"文件夹".那又一次如何失败?我如何在注册表中创建"文件"?
是否可以禁用纹理颜色,并仅使用白色作为颜色?它仍然会读取纹理,所以我不能使用glDisable(GL_TEXTURE_2D),因为我也想渲染alpha通道.
我现在能够想到的是制作新的纹理,其中所有颜色数据都是白色的,保持原样的alpha.
我需要在没有着色器的情况下这样做,所以这甚至可能吗?
编辑:澄清:我想使用两种纹理:白色和普通颜色.
编辑:显然这是不可能的
这对我来说有点不清楚......所以,如果我有一个功能:
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[]通话使用吗?
我想修改glBindTexture()函数来跟踪以前绑定的纹理ID.目前我刚为它创建了新功能,但后来我意识到,如果我使用其他使用glBindTexture的代码:那么我的整个系统可能会进入厕所.
那我该怎么办?
编辑:现在,当我想到它,检查我是否应该绑定纹理是没有用的,因为opengl可能已经这样做了.但我仍然需要跟踪以前使用的纹理.
我有问题,我正在使用我的文件的相对路径,所以当我使用"打开方式"方法打开我的程序中的文件时,我的所有路径都被搞砸了(它将在我使用它的文件夹中创建我的文件"打开"方法."
我怎样才能检索我用来打开文件的.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) 我不想每次更改它的一小部分时更新整个纹理,这个命令是什么?
当我进行mipmapping时,使用GL_GENERATE_MIPMAP进行设置,内部的优化程度如何?它会再次计算整个图像,还是只更新我的部分?
我在某些情况下使用以下代码:
#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.
它们都快吗......?或者假设我没有在地图值中使用零值,第二种情况是否有可能出现错误?到目前为止,第二种情况似乎工作正常.
我已将每个函数放在自己的文件中.
如何一次性包含所有这些功能而不必手动重复每个文件的#include?我不在乎功能包含在哪个顺序.
编辑:来自数百个不同文件的所有功能属于同一组.实际上每个文件有4个功能......
c++ ×10
opengl ×5
windows ×2
command-line ×1
function ×1
glreadpixels ×1
hook ×1
include ×1
new-operator ×1
registry ×1
windows-xp ×1