OpenGL透明性不透明

亚瑟·斯坦森(Arthur Statham)ArvsGamer

我知道以前曾有人问过这个问题,但其他答案都无法解决我的特定问题。我有一个简单的C ++和OpenGL程序,可在其中绘制带纹理的立方体。纹理的透明度显示为黑色。我不确定自己在做什么错

#include <GL/glew.h>
#include <SFML/OpenGL.hpp>
#include <iostream>
#include <SFML/Window.hpp>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include "shader.h"
#include "mesh.h"

int main(int argc, char* argv[])
{
sf::Window window(sf::VideoMode(640, 480), "OpenGL Test", sf::Style::Close);
sf::Event event;

glewInit();

//clear color
glEnable(GL_TEXTURE_2D);
glClearColor(0.8, 0.8, 0.8, 1);

glEnable(GL_BLEND);
glAlphaFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

//view and projection matrix
glm::mat4 projection = glm::perspective<float>(glm::radians(45.f), 640.f / 480.f, 0.1f, 100.f); //fov, ratio, display range min, display range max

glm::mat4  view = glm::lookAt(
    glm::vec3(4, 3, 3), //camera position
    glm::vec3(0, 0, 0), //camera looking at this position
    glm::vec3(0, 1, 0) //head is up
    );

//shader
Shader shader;

shader.loadVertex("testShader.vs");
shader.loadFragment("testShader.fs");
shader.link();

float points[] = {

    -0.8, -0.8, -0.8,
    -0.8, 0.8, -0.8,
    0.8, 0.8, -0.8,
    0.8, -0.8, -0.8,

    -0.8, 0.8, 0.8,
    0.8, 0.8, 0.8,

    -0.8, -0.8, 0.8,
    0.8, -0.8, 0.8
};

//irrelevent for now...
float colors[] = {
    1, 0, 0,
    0, 1, 0,
    0, 0, 1,
    1, 1, 1,
    1, 0, 0,
    0, 1, 0,
    0, 0, 1,
    1, 1, 1
};

float texCoords[] = {
    0, 1,
    0, 0,
    1, 0,
    1, 1,
    0, 1,
    1, 1,
    0, 0,
    1, 0
};

unsigned int elements[] = {
    0, 1, 2, 2, 3, 0, //front
    1, 4, 5, 5, 2, 1, //top
    4, 6, 7, 7, 5, 4, //back
    6, 0, 3, 3, 7, 6, //bottom
    3, 2, 5, 5, 7, 3, //right
    6, 4, 1, 1, 0, 6 //left
};


Mesh mesh(&projection, &view, 8, points, 36, elements, texCoords, colors);
mesh.setShader(shader);

while (window.isOpen())
{
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();

        //resize viewport if window is resized
        else if (event.type == sf::Event::Resized)
            glViewport(0, 0, event.size.width, event.size.height);
    }

    glClear(GL_COLOR_BUFFER_BIT);

    mesh.draw();

    window.display();
}


return 0;
}

我不会发布所有代码,因为它们位于单独的类中,但是这里是用于在纹理很重要的情况下加载纹理的代码。

//texture
sf::Image image;
image.loadFromFile("Numel.png");

textureID = 0;

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.getSize().x, image.getSize().y, false, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

这是我的着色器:

(顶点着色器)

#version 450

in vec3 v_pos;
in vec3 v_color;
in vec2 v_texCoord;

out vec3 color;
out vec2 texCoord;

uniform mat4 mvp;

void main()
{
    color=v_color;
    texCoord=v_texCoord;
    gl_Position=mvp*vec4(v_pos, 1.0);
}

(片段着色器)

#version 450

in vec3 color;
in vec2 texCoord;

out vec4 f_color;

uniform sampler2D texture;

void main()
{
    f_color=texture2D(texture, texCoord);
}

为了明确起见,我的图像是PNG,它是256x256(2的幂),并且实际上具有透明像素。

雷托·科拉迪(Reto Koradi)

您永远不会设置混合功能。您可能认为您可以通过以下电话进行操作:

glAlphaFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

但这是不同的。该调用将用于设置alpha测试功能。如果您不知道那是什么,请不要打扰。Alpha测试是已弃用的功能,OpenGL核心配置文件中不再支持该功能。实际上,在某些情况下,它在固定功能的OpenGL中非常有用,但可以通过可编程管道轻松实现,因此,实际上不再需要专用的alpha测试。

您要调用的设置混合功能的方法是:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

如果您的OpenGL代码无法正常工作,请确保始终调用glGetError()在这种情况下,您将立即出错,因为所glAlphaFunc()接受的参数与完全不同glBlendFunc(),因此glGetError()GL_INVALID_ENUM立即返回

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何改变图像的不透明性

来自分类Dev

jQuery不透明性慢褪色

来自分类Dev

OpenGL绘制不透明纹理透明

来自分类Dev

jQuery-从元素获取颜色并将其用于不透明性

来自分类Dev

背景不透明性减少混入可能吗?

来自分类Dev

如何使用CSS淡化图像而没有不透明性?

来自分类Dev

背景图像线性渐变动画不透明性

来自分类Dev

有没有办法避免不透明性被继承?

来自分类Dev

摆脱图像中不必要的CSS不透明性?

来自分类Dev

过渡的不透明性在Java脚本中无法流畅运行

来自分类Dev

具有不透明性的Bootstrap模态出现在背景后面

来自分类Dev

OpenGL透明性无法正常工作

来自分类Dev

为什么材质设计中的活动图标和非活动图标具有不同的不透明性?

来自分类Dev

Firefox上具有不透明性和z-index的意外CSS 3过渡

来自分类Dev

将图像放置在另一幅图像上方且没有不透明性

来自分类Dev

使JComponent不透明

来自分类Dev

图像不透明

来自分类Dev

不透明的问题

来自分类Dev

动态生成的元素通过使用不透明性和过渡性而显得较低?(JavaScript,CSS)

来自分类Dev

如何在OpenGL上使立方体面不透明?

来自分类Dev

如何从菜单解决mouseenter和mouselieave上的不透明性问题?

来自分类Dev

比较不透明或交易性卡夫卡喷口

来自分类Dev

具有不透明性的孩子不能出现在具有z-index的父级兄弟姐妹下方

来自分类Dev

Famo.us-如何创建具有背景不透明性但不具有文本的表面

来自分类Dev

Skrollr背景透明性?

来自分类Dev

透明的div,但不透明

来自分类Dev

文本不透明时的不透明背景

来自分类Dev

导航栏不透明

来自分类Dev

不透明和模糊

Related 相关文章

热门标签

归档