cocoa - 使用 Alpha 渲染纹理的问题

标签 cocoa opengl textures

我目前正在设计一个游戏引擎,我在图像中遇到了一个问题,图像中的 alpha 值没有被渲染。我目前正在使用 OpenGL 系统,其中每个纹理对象都有顶点、颜色和纹理坐标的缓冲区,这些缓冲区在 drawRect: 方法中绑定(bind)并绘制在一起。虽然 Alpha 会混合整个图像,但我希望用于混合到纹理中的颜色,因为它当前充当纹理的“背景”,在具有 Alpha 的纹理区域中变得可见。当绘图时不使用颜色时,任何 Alpha 区域都只会显示为白色。

这是我不想渲染的带有 Alpha 的图像(作为测试),它的显示方式如下:

The image I'm trying to render with the alpha it has

How the image is rendered

这是我的代码:

我的纹理对象类的一部分:

如果(宽度2 == 2 && 高度2 == 2){

        // Allocate the texture.  Apples storage method currently does not work for GL_TEXTURE_2D.  REVISIT CODE TO INTEGRATE IT!
        glEnable(GL_TEXTURE_2D);
        glGenTextures(1, &myTextureName);
        glBindTexture(GL_TEXTURE_2D, myTextureName);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, myData);
        //glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT ,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB,myTextureName, 0);

        type = Normal_Texture;
        CDMeshVertexesCreateRectangle(1, 1, texture);
    }

    else {
        // The extension GL_TEXTURE_RECTANGLE_ARB can be used for non-power of two textures, but it is slower than GL_TEXTURE_2D and 
        // not supported by all graphics cards.
        glEnable(GL_TEXTURE_RECTANGLE_ARB);
        glGenTextures(1, &myTextureName);
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, myData);
        //glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT ,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB,myTextureName, 0);

        type = Rectangular_Texture;
        CDMeshVertexesCreateRectangle(width, height, texture);
    }

在对象内部运行渲染的代码:

glEnableClientState(GL_VERTEX_ARRAY); // Activate vertex coordinates array
glEnableClientState(GL_COLOR_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexPointer(vertexStride, GL_FLOAT, 0, 0);   

glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glColorPointer(colorStride, GL_FLOAT, 0, 0);

// Enable client states for drawing the various arrays
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(texType);

// Bind buffer and use the VBO's to draw
glBindBuffer(GL_ARRAY_BUFFER, texBuffer);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindTexture(texType, texID);

//render
glDrawArrays(renderStyle, 0, vertexCount);

glDisableClientState(GL_VERTEX_ARRAY); // Deactivate vertex coordinates array
glDisableClientState(GL_COLOR_ARRAY);

// Disale client states as were done with them.
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(texType);

用于渲染的其他设置:

glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
glDisable(GL_BLEND);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_FLAT);

关于如何做到这一点有什么建议吗?

更新2 我已编辑 gltexEnv() 函数以使用 GL_MODULATE 而不是 GL_BLEND。这对我遇到的问题没有影响,尽管我将继续使用 GL_MODULATE 进行 alpha 混合。

更新3 为了解释我到底需要什么,我主要希望能够使用提供的混合纹理的颜色指针来显示图像,而不是像现在一样在纹理后面填充这种颜色。纹理数据设置正确,我已经完成了许多步骤来缩小问题范围。这是问题的示例图片:

enter image description here

最佳答案

一旦我到达那里,我也需要为我的应用程序执行此操作:/。

我现在无法测试这个,但我知道你的混合函数是关键 - 现在你直接用 Alpha 将纹理混合到表面上。尝试更改您的混合函数。我过去使用过这些:glBlendFunc (GL_ONE, GL_ONE);或 glBlendFunc (GL_SRC_ALPHA, GL_ONE);

有一个纹理组合器的 wiki 条目:http://www.opengl.org/wiki/Texture_Combiners

关于cocoa - 使用 Alpha 渲染纹理的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6817974/

相关文章:

macos - 如何为 mac 的 .app 创建 dmg 文件?

c++ - glutswapbuffers 实际上做了什么?

c++ - 如何在 MacOS 上的 NodeJS native 插件上创建 OpenGL 上下文?

c++ - OpenGL Y 纹理坐标行为异常

android - 是否应该动态加载和卸载 OpenGL 纹理

objective-c - 沙盒 Mac 应用耗尽安全范围的 URL 资源

macos - NSView 禁用平滑滚动

objective-c - 无法链接 IBaction 或 IBOutlet

c - 为什么这个程序不能改变制服?

javascript - 如何在 Three.js 中向 .obj 模型添加颜色?