小编Roo*_*kie的帖子

如何获取原始数据的std :: vector指针?

我正在尝试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.

c++ stl vector

150
推荐指数
3
解决办法
13万
查看次数

GL_QUADS有什么不好的?

我听说GL_QUADS将在OpenGL版本> 3.0中删除,为什么会这样?我的旧程序将来不会有用吗?我已经进行了基准测试,GL_TRIANGLES或者GL_QUADS在渲染速度方面没有差异(甚至可能GL_QUADS更快).那么重点是什么?

opengl deprecated

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

如何将std :: string传递给glShaderSource?

我有以下代码:

glShaderSource(shader, 1, (const char **)data.c_str(), NULL);
Run Code Online (Sandbox Code Playgroud)

但这会让我的程序崩溃.我怎么转换std::stringconst 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但显然它没有任何区别.

c++ opengl string char

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

如何用等角透视渲染?

可能重复:
使用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

c++ opengl isometric

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

OpenGL:如何检查用户GFX卡是否可以使用我的着色器进行渲染?

如果用户不支持我更快地呈现某些内容的着色器,我需要做一个后备.

那么,我究竟如何检查这些东西呢?我知道一些GLSL版本不支持某些着色器功能,但是,这些功能的完整列表与它们需要的版本在哪里?

但问题是,我不知道究竟需要知道什么才能知道谁可以渲染该着色器.它只是关于检查哪个GLSL版本支持哪个功能?还是有更多要知道的东西?我想100%确定何时切换到回退渲染以及何时使用GLSL渲染.

我知道如何检索GLSL和OpenGL版本字符串.

c++ opengl shader fallback glsl

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

如何使用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)乘以颜色值不是一个选项,因为它不会使像素变成黑色,它们将永远保持在屏幕上一定的亮度(见上面某处的解释).

c++ opengl blending

4
推荐指数
2
解决办法
7155
查看次数

如何检查我的窗口是否隐藏/可见?

如果我在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)

c++ opengl winapi visual-studio-2008

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

消息处理程序 INT_PTR 返回值的目的是什么?

我在玩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,以及我应该什么时候使用其他东西(如果我应该的话)?

c++ winapi visual-studio-2008 visual-c++

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

如何实现自己的函数到std :: vector?

我想添加一个函数,它将.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)

从积极的方面来看:这似乎根本不会增加我的可执行文件大小.

c++ std

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