C++ 如何使用alpha渲染纹理?

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级别创建不同的纹理?

您的纹理是GL_RGBA,因此每个纹理都有不同的alpha值

如果要更改用于渲染的alpha值,我可以考虑以下方法:

  • 更改纹理alpha值(不确定您是否说不想这样做)
  • 使用
    glColor4f
    更改顶点的alpha值。它将使纹理值相乘。您可能需要使用
    glEnable(GL\u COLOR\u MATERIAL)
    和/或
    glcolor MATERIAL()
  • 使用顶点着色器更改顶点alpha值。它将使纹理值相乘
  • 使用片段着色器动态更改采样的纹理值
  • 使用两个纹理阶段并将它们相乘。第二个将具有修改后的alpha值(请参见
    glActiveTexture()
    和friends)
  • 使用片段着色器和两个(或更多)纹理阶段。这是最酷的
      您的纹理是GL_RGBA,因此每个纹理都有不同的alpha值

      如果要更改用于渲染的alpha值,我可以考虑以下方法:

      • 更改纹理alpha值(不确定您是否说不想这样做)
      • 使用
        glColor4f
        更改顶点的alpha值。它将使纹理值相乘。您可能需要使用
        glEnable(GL\u COLOR\u MATERIAL)
        和/或
        glcolor MATERIAL()
      • 使用顶点着色器更改顶点alpha值。它将使纹理值相乘
      • 使用片段着色器动态更改采样的纹理值
      • 使用两个纹理阶段并将它们相乘。第二个将具有修改后的alpha值(请参见
        glActiveTexture()
        和friends)
      • 使用片段着色器和两个(或更多)纹理阶段。这是最酷的
      首先,确保您的纹理具有alpha通道。您提到正在加载RGBA格式,但在图像编辑程序中检查原始文件总是好的。然后确保纹理已准备好在openGL中渲染。一个常见的错误是忘记通过
      glTexParameter*
      设置纹理的过滤模式。它从需要mipmap的设置开始,因此我发现最容易从以下设置开始:

      glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_MAG_FILTER, GL_LINEAR);
      
      其次,您将需要设置openGL以准备混合。这涉及使用
      glu BLEND
      调用
      glEnable
      glBlendFunc
      调用。大多数情况下,您会希望函数调用是
      glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)
      ,因为大多数其他标记组合会给您带来您不想要的效果(有关更多信息,请参阅规范页面)


      最后,确保在不同点对纹理进行采样。如果使用即时模式(使用
      glVertex*
      绘制场景),则在调用
      glVertex*
      之前,需要使用
      glTexGen*
      或使用
      glTexCoord*
      手动指定纹理点。如果使用阵列数据绘制场景,请确保已使用
      glEnableClientState(GL_texture_COORD_array)
      glTexCoordPointer

      启用纹理指针。首先,确保纹理具有alpha通道。您提到正在加载RGBA格式,但在图像编辑程序中检查原始文件总是好的。然后确保纹理已准备好在openGL中渲染。一个常见的错误是忘记通过
      glTexParameter*
      设置纹理的过滤模式。它从需要mipmap的设置开始,因此我发现最容易从以下设置开始:

      glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_MAG_FILTER, GL_LINEAR);
      
      其次,您将需要设置openGL以准备混合。这涉及使用
      glu BLEND
      调用
      glEnable
      glBlendFunc
      调用。大多数情况下,您会希望函数调用是
      glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)
      ,因为大多数其他标记组合会给您带来您不想要的效果(有关更多信息,请参阅规范页面)


      最后,确保在不同点对纹理进行采样。如果使用即时模式(使用
      glVertex*
      绘制场景),则在调用
      glVertex*
      之前,需要使用
      glTexGen*
      或使用
      glTexCoord*
      手动指定纹理点。如果使用数组数据绘制场景,请确保已使用
      glEnableClientState(GL_texture_COORD_array)
      glTexCoordPointer

      启用纹理指针。什么结构保存图像?我有一个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_调制?可能是的。此外,如果您已启用总账