我正在尝试std::vector
用作char
数组.
我的函数接受一个void指针:
void process_data(const void *data);
Run Code Online (Sandbox Code Playgroud)
在我刚刚使用此代码之前:
char something[] = "my data here";
process_data(something);
Run Code Online (Sandbox Code Playgroud)
哪个按预期工作.
但现在我需要动态性std::vector
,所以我尝试了这个代码:
vector<char> something;
*cut*
process_data(something);
Run Code Online (Sandbox Code Playgroud)
问题是,如何将char矢量传递给我的函数,以便我可以访问矢量原始数据(无论是哪种格式 - 浮点数等)?
我试过这个:
process_data(&something);
Run Code Online (Sandbox Code Playgroud)
还有这个:
process_data(&something.begin());
Run Code Online (Sandbox Code Playgroud)
但是它返回了指向乱码数据的指针,后者发出了警告:warning C4238: nonstandard extension used : class rvalue used as lvalue
.
我听说GL_QUADS
将在OpenGL版本> 3.0中删除,为什么会这样?我的旧程序将来不会有用吗?我已经进行了基准测试,GL_TRIANGLES
或者GL_QUADS
在渲染速度方面没有差异(甚至可能GL_QUADS
更快).那么重点是什么?
我有以下代码:
glShaderSource(shader, 1, (const char **)data.c_str(), NULL);
Run Code Online (Sandbox Code Playgroud)
但这会让我的程序崩溃.我怎么转换std::string
成const char **
?我也试过, (const char **)&
但它说"需要l值",我不明白.我使用这段代码时工作正常:
const char *data = "some code";
glShaderSource(shader, 1, &data, NULL);
Run Code Online (Sandbox Code Playgroud)
但我不能直接从一个工作std::string
.我可以char
为它分配一个新数组,但这不是很好的代码.
我也尝试过,const GLchar
但显然它没有任何区别.
可能重复:
使用opengl进行真正的等轴测投影
我想使用Blender3d使用的相同等距渲染进行渲染,我该怎么做?只需调用glMultMatrix()就可以了吗?我尝试使用谷歌搜索,但无法找到任何可能导致这种渲染模式的工作矩阵.我试过这个http://en.wikipedia.org/wiki/Isometric_projection,但它只是渲染得非常奇怪.
这是我现在使用的矩阵,以正常的视角渲染:
GLdouble f = cotan(fovy/2.0);
GLdouble aspect = (GLdouble)width/(GLdouble)height;
IsoMatrix.x[0] = f/aspect;
IsoMatrix.y[0] = 0;
IsoMatrix.z[0] = 0;
IsoMatrix.w[0] = 0;
IsoMatrix.x[1] = 0;
IsoMatrix.y[1] = f;
IsoMatrix.z[1] = 0;
IsoMatrix.w[1] = 0;
IsoMatrix.x[2] = 0;
IsoMatrix.y[2] = 0;
IsoMatrix.z[2] = (zfar+znear)/(znear-zfar);
IsoMatrix.w[2] = (2.0*zfar*znear)/(znear-zfar);
IsoMatrix.x[3] = 0;
IsoMatrix.y[3] = 0;
IsoMatrix.z[3] = -1;
IsoMatrix.w[3] = 0;
glMultMatrixd((GLdouble *)&IsoMatrix);
Run Code Online (Sandbox Code Playgroud)
我如何改变它以便产生:http: //rvzenteno.files.wordpress.com/2008/10/rvz_018.jpg?
如果用户不支持我更快地呈现某些内容的着色器,我需要做一个后备.
那么,我究竟如何检查这些东西呢?我知道一些GLSL版本不支持某些着色器功能,但是,这些功能的完整列表与它们需要的版本在哪里?
但问题是,我不知道究竟需要知道什么才能知道谁可以渲染该着色器.它只是关于检查哪个GLSL版本支持哪个功能?还是有更多要知道的东西?我想100%确定何时切换到回退渲染以及何时使用GLSL渲染.
我知道如何检索GLSL和OpenGL版本字符串.
我试图实现淡入淡出效果,但我不知道该怎么做.我尝试了几件事但由于opengl的工作方式而失败了
我会解释它是如何工作的:
如果我绘制1个白色像素和后255帧中的白色像素移动它围绕每个帧用于一个像素的一些方向,每个帧中的屏幕像素将获得一个R/G/B值以下(范围0-255),从而将完全黑了.因此,如果我移动白色像素,我会看到渐变轨迹从白色到黑色均匀地与前一像素颜色相比1色值差异.
编辑:我更喜欢知道非着色的方式,但如果它不可能,那么我也可以接受着色器方式.
编辑2:由于这里有一些混乱,我想告诉我,我可以通过在整个场景上绘制一个黑色透明四边形来做到这种效果.但是,这不起作用,因为我希望它工作; 有在黑暗中的像素可以得到一个限制,所以它总是会留下一些像素的"可见"(零以上颜色值),因为:1*0.9 = 0.9 - >四舍五入到1再等我能"修复"通过缩短路径,但我希望能够尽可能地调整路径长度,而不是双线性(如果那是正确的词)插值我想要线性(所以它总是从每个r减少-1, g,b值为0-255比例,而不是使用百分比值).
编辑3:还有一些混乱,所以我们要清楚:我想通过从glClear()禁用GL_COLOR_BUFFER_BIT来改善效果,我不想看到我的屏幕上的像素FOREVER,所以我想让它们更黑暗的时间,通过在我的场景上绘制一个四边形,将每个像素的颜色值减1(在0-255比例范围内).
编辑4:我会让它变得简单,我想要OpenGL方法,效果应尽量少用电,内存或带宽.这个效果应该可以在不清除屏幕像素的情况下工作,所以如果我在我的场景上绘制一个透明的四边形,之前绘制的像素会变暗等.但如上所述几次,它不能很好地工作.大的NO是:1)从屏幕读取像素,在for循环中逐个修改它们然后上传回来.2)使用不同的暗度渲染我的物体X次以模拟轨迹效果.3)乘以颜色值不是一个选项,因为它不会使像素变成黑色,它们将永远保持在屏幕上一定的亮度(见上面某处的解释).
如果我在Windows7中按“显示桌面”按钮,我的程序仍会认为它没有最小化,并且如果我WIN+D
在程序处于焦点状态时按,则只有我的程序才能捕获此最小化命令。我如何100%确保我的程序可见或不可见?
这是我的主循环:
while(!done){
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if(msg.message == WM_QUIT){
done = TRUE;
}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}else if(active){
render();
}
}
Run Code Online (Sandbox Code Playgroud)
Edit3:这样好吗?看起来像它的工作:
case WM_WINDOWPOSCHANGED:
{
flags = ((PWINDOWPOS)lParam)->flags;
if((flags & 0x8000) && (flags & SWP_NOCOPYBITS) && (flags & SWP_FRAMECHANGED)){
active = !(flags & SWP_NOACTIVATE);
}
if((flags & 0x1000) && (flags & 0x0800) && (flags & SWP_NOMOVE) && (flags & SWP_NOSIZE)){
active = 1;
}
}
case WM_ACTIVATE:
{
active = !HIWORD(wParam);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在玩visual studio的windows窗体,示例代码是这样的:
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
/*code cut*/
case WM_INITDIALOG:
return (INT_PTR)TRUE;
break;
Run Code Online (Sandbox Code Playgroud)
虽然我的其他处理程序函数如下所示:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
/*code cut*/
return 0; // no magical casting or anything, just plain int
Run Code Online (Sandbox Code Playgroud)
我有一个线索,在 WndProc() 中,当我执行 areturn 0;
这意味着消息不会被默认消息处理程序处理?但是如果你这样做,return 1;
它会用默认处理程序处理吗?
但重点是return (INT_PTR)TRUE;
什么?在那里使用普通return 0;
样式是否安全?我尝试编译,它也只适用于普通整数值。
另外,我不确定什么时候应该使用哪个值,示例代码有这个:
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
Run Code Online (Sandbox Code Playgroud)
但是return (INT_PTR)TRUE;
那里有什么意义呢?我将其更改为FALSE
但在功能上看不出任何差异。
所以,我不确定这是在做什么,任何人都可以清除我的想法,我什么时候应该使用return 1
,什么时候应该使用return 0
,以及我应该什么时候使用其他东西(如果我应该的话)?
我想添加一个函数,它将.size()值作为整数返回,而不是无符号整数.
编辑:由于评论,我解释更详细:
我有代码:
int something = 3;
if(arr.size() > something)
Run Code Online (Sandbox Code Playgroud)
这将产生编译器警告,我不喜欢添加(int)到我拥有它的每个地方.所以,我认为使用sizei()函数会很好的解决方案:
int something = 3;
if(arr.sizei() > something)
Run Code Online (Sandbox Code Playgroud)
哪个不会产生警告.
所以,我不想创建一个单独的函数,而是std :: vector本身的一个函数.
编辑:似乎这样做的唯一方法是创建另一个函数,例如:
template <typename T>
inline int sizei(const T &arr){
return (int)arr.size();
}
Run Code Online (Sandbox Code Playgroud)
从积极的方面来看:这似乎根本不会增加我的可执行文件大小.