C++ 如何使用alpha渲染纹理?
如何使用alpha渲染纹理 我有一个纹理,需要在不同的位置用不同的alpha值进行渲染。有什么办法吗?(我的纹理是GL_RGBA)C++ 如何使用alpha渲染纹理?,c++,visual-c++,opengl,textures,alpha,C++,Visual C++,Opengl,Textures,Alpha,如何使用alpha渲染纹理 我有一个纹理,需要在不同的位置用不同的alpha值进行渲染。有什么办法吗?(我的纹理是GL_RGBA) 如果无法动态更改alpha值,我必须为不同的alpha级别创建不同的纹理?您的纹理是GL_RGBA,因此每个纹理都有不同的alpha值 如果要更改用于渲染的alpha值,我可以考虑以下方法: 更改纹理alpha值(不确定您是否说不想这样做) 使用glColor4f更改顶点的alpha值。它将使纹理值相乘。您可能需要使用glEnable(GL\u COLOR\u M
如果无法动态更改alpha值,我必须为不同的alpha级别创建不同的纹理?您的纹理是GL_RGBA,因此每个纹理都有不同的alpha值 如果要更改用于渲染的alpha值,我可以考虑以下方法:
- 更改纹理alpha值(不确定您是否说不想这样做)
- 使用
更改顶点的alpha值。它将使纹理值相乘。您可能需要使用glColor4f
和/或glEnable(GL\u COLOR\u MATERIAL)
glcolor MATERIAL()
- 使用顶点着色器更改顶点alpha值。它将使纹理值相乘
- 使用片段着色器动态更改采样的纹理值
- 使用两个纹理阶段并将它们相乘。第二个将具有修改后的alpha值(请参见
和friends)glActiveTexture()
- 使用片段着色器和两个(或更多)纹理阶段。这是最酷的李>
- 您的纹理是GL_RGBA,因此每个纹理都有不同的alpha值
如果要更改用于渲染的alpha值,我可以考虑以下方法:
- 更改纹理alpha值(不确定您是否说不想这样做)
- 使用
更改顶点的alpha值。它将使纹理值相乘。您可能需要使用glColor4f
和/或glEnable(GL\u COLOR\u MATERIAL)
glcolor MATERIAL()
- 使用顶点着色器更改顶点alpha值。它将使纹理值相乘
- 使用片段着色器动态更改采样的纹理值
- 使用两个纹理阶段并将它们相乘。第二个将具有修改后的alpha值(请参见
和friends)glActiveTexture()
- 使用片段着色器和两个(或更多)纹理阶段。这是最酷的李>
设置纹理的过滤模式。它从需要mipmap的设置开始,因此我发现最容易从以下设置开始:glTexParameter*
其次,您将需要设置openGL以准备混合。这涉及使用glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_MAG_FILTER, GL_LINEAR);
调用glu BLEND
和glEnable
调用。大多数情况下,您会希望函数调用是glBlendFunc
,因为大多数其他标记组合会给您带来您不想要的效果(有关更多信息,请参阅规范页面)glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)
最后,确保在不同点对纹理进行采样。如果使用即时模式(使用
绘制场景),则在调用glVertex*
之前,需要使用glVertex*
或使用glTexGen*
手动指定纹理点。如果使用阵列数据绘制场景,请确保已使用glTexCoord*
和glEnableClientState(GL_texture_COORD_array)
启用纹理指针。首先,确保纹理具有alpha通道。您提到正在加载RGBA格式,但在图像编辑程序中检查原始文件总是好的。然后确保纹理已准备好在openGL中渲染。一个常见的错误是忘记通过glTexCoordPointer
设置纹理的过滤模式。它从需要mipmap的设置开始,因此我发现最容易从以下设置开始:glTexParameter*
其次,您将需要设置openGL以准备混合。这涉及使用glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_MAG_FILTER, GL_LINEAR);
调用glu BLEND
和glEnable
调用。大多数情况下,您会希望函数调用是glBlendFunc
,因为大多数其他标记组合会给您带来您不想要的效果(有关更多信息,请参阅规范页面)glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)
最后,确保在不同点对纹理进行采样。如果使用即时模式(使用
绘制场景),则在调用glVertex*
之前,需要使用glVertex*
或使用glTexGen*
手动指定纹理点。如果使用数组数据绘制场景,请确保已使用glTexCoord*
和glEnableClientState(GL_texture_COORD_array)
启用纹理指针。什么结构保存图像?我有一个DIB数据(从HBITMAP转换),然后我从DIB创建纹理,但DIB数据在创建纹理后立即被删除。(即:free(dib_data_handle);)什么结构保存图像?我有一个dib数据(从HBITMAP转换),然后我从dib创建纹理,但dib数据在创建纹理后立即被删除。(即:free(dib_data_handle);)我想要的是将每个像素的alpha减少一半,我应该选择哪种解决方案?只要启用颜色,glColor4f(1,1,1,0.5f)就可以做到。我需要启用GL_混合,并且在生成纹理时必须使用GL_调制吗?可能是和是。此外,如果启用了GL_照明,您还需要启用GL_颜色_材质,因此glColor会做一些有用的事情。我想要的是将每个像素的alpha减少一半,我应该选择哪种解决方案?只要启用颜色,glColor4f(1,1,1,0.5f)就可以做到这一点。我是否需要启用GL_混合,我必须在生成纹理时使用GL_调制?可能是的。此外,如果您已启用总账glTexCoordPointer