小编Bjo*_*ern的帖子

用GLSL渲染矩形纹理

我创建了一个类,它将视频帧(在Mac上)呈现给自定义的帧缓冲对象.作为输入,我有一个YUV纹理,我成功创建了一个片段着色器,它输入3个矩形纹理(每个用于Y,U和V平面,其数据由glTexSubImage2D使用GL_TEXTURE_RECTANGLE_ARB,GL_LUMINANCE和GL_UNSIGNED_BYTE上传)在渲染之前,我将活动纹理设置为三个不同的纹理单元(0,1和2)并为每个纹理单元绑定纹理,出于性能原因,我使用了GL_APPLE_client_storage和GL_APPLE_texture_range.然后我用glUseProgram(myProg),glBegin(GL_QUADS)...... glEnd()渲染它.

这很好,我得到了预期的结果(除了闪烁效果,我想这与我在两个不同的线程上使用两个不同的GL上下文这一事实有关,我想它们在某些时候相互接触[这是以后另一个问题的主题]).无论如何,我决定通过添加一个顶点着色器来进一步改进我的代码,这样我就可以跳过glBegin/glEnd - 我读到的已经过时了,无论如何都应该避免.

因此,作为下一步,我创建了两个缓冲区对象,一个用于顶点,另一个用于纹理坐标:

      const GLsizeiptr posSize = 4 * 4 * sizeof(GLfloat);
      const GLfloat posData[] =
      {
            -1.0f, -1.0f, -1.0f, 1.0f,
             1.0f, -1.0f, -1.0f, 1.0f,
             1.0f,  1.0f, -1.0f, 1.0f,
            -1.0f,  1.0f, -1.0f, 1.0f
        };

        const GLsizeiptr texCoordSize = 4 * 2 * sizeof(GLfloat);
        const GLfloat texCoordData[] =
        {
            0.0, 0.0,
            1.0, 0.0,
            1.0, 1.0,
            0.0, 1.0
        };

    glGenBuffers(1, &m_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, posSize, posData, GL_STATIC_DRAW);

    glGenBuffers(1, &m_texCoordBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
    glBufferData(GL_ARRAY_BUFFER, texCoordSize, texCoordData, GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

然后在加载着色器后,我尝试在顶点着色器中检索属性的位置:

        m_attributeTexCoord = glGetAttribLocation( …
Run Code Online (Sandbox Code Playgroud)

opengl glsl vertex-shader

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

.NET 应用程序加载混合 dll,使用任何 CPU

我是创建 .NET 应用程序的新手,尤其是混合应用程序。

最近,我在(非托管)C++(在 MS Visual Studio 2010 下)中为客户端创建了一组(静态)库,支持 32 位和 64 位编译,由某些应用程序加载,通常很好. (在内部,此功能使用各种其他第三方库,如 OpenGL、boost、glm 等)

现在,他还希望能够在他的 C# 应用程序中使用我作为自定义控件提供的一些功能。

所以我创建了一个支持 CLR 的 dll,使用 C++/CLI 为我的功能创建包装类,然后创建一个自定义的 WPF 控件,它是公共的(因此可以从外部访问),再次在两者中构建都可以正常工作32 位和 64 位。

然后为了测试,我创建了一个简单的 C# 应用程序(它真的很简单,因为我是 C# 新手,我的背景是 C/C++),它可以内置 32 位或 64 位,并且可以成功地从我的 DLL 加载控件并做它应该做的事情。

我现在遇到的问题是,他说他只想将单个可执行文件作为“任何 CPU”分发,然后根据启动位置加载适当的代码(即 32 位或 64 位)。

所以我所做的是在 C# 测试项目中添加一个“Any CPU”配置,并将“build”选项卡下的“platform target”设置为“Any CPU”。但现在我不确定在配置管理器下为其他项目设置什么平台(即 C++ 静态库,由 C++/CLI 混合模式 dll 使用)。所以为了测试我把它留在 x64 上,但是当我构建它时,我收到警告:

Warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the …
Run Code Online (Sandbox Code Playgroud)

.net mixed-mode anycpu

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

单一 OpenGL 上下文,多个视图

我有一个 Windows 应用程序,可以创建多个视图窗口,可以使用 OpenGL (3.2+) 渲染一些模型。每个窗口都可以渲染它自己的独立对象,或者两个(或更多)窗口可以渲染相同的对象(但例如从不同的相机角度):

例子

在阅读了 stackoverflow 上的各种帖子后,我决定创建一个 OpenGL 上下文 (HGLRC),对于我渲染到的每个窗口 (HDC),我切换为

wglMakeCurrent(targetWindowHDC, m_deviceContext)
Run Code Online (Sandbox Code Playgroud)

正如您在屏幕截图中所看到的,这似乎工作得很好(窗口代码发生在主线程上,对于渲染,我有自己的 RenderThread,所有 OpenGL 操作都限制在其中)。对于每个窗口,我都会渲染到 FBO(如果用户激活它,则该 FBO 具有 MSAA 支持),只有在场景中的某些内容发生变化时才会更新,否则它只会按原样将其绘制到窗口。

现在我的问题是,每次切换到绘图到另一个窗口时都必须设置什么状态?我的方法在性能方面合理吗?

这是我现在每次将上下文设为另一个 HDC 的当前上下文后设置的内容:

glClearDepth( 1.0f );
glClearColor( color.r, color.g, color.b, 1.0f );
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glDepthRange(0.0f, 1.0f);
glPointSize(3.0f);
glEnable(GL_BLEND);
glBlendFunc( srcBlend, dstBlend );
glPolygonMode( GL_FRONT_AND_BACK, targetType );
glEnable( GL_CULL_FACE );
glCullFace( GL_BACK );    
glViewport( 0, 0, vp.width, vp.height );
Run Code Online (Sandbox Code Playgroud)

这些基本上是用户设置渲染窗口时可以更改的所有设置,因此我需要在渲染每个窗口之前确保它们设置正确。

但真的有必要拨打所有这些电话吗?这意味着在上面有 4 个渲染窗口的示例中,我需要每帧调用这些窗口 4 次。有没有更好的办法?使用多个 GL 上下文会更高效吗?

windows opengl openglcontext

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