Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL透明性是不透明的_C++_Opengl_Sfml - Fatal编程技术网

C++ OpenGL透明性是不透明的

C++ OpenGL透明性是不透明的,c++,opengl,sfml,C++,Opengl,Sfml,我知道以前有人问过这个问题,但其他答案都不能解决我的具体问题。我有一个简单的C++和OpenGL程序,我在那里画一个纹理立方体。纹理的透明度显示为黑色。我不确定我做错了什么 #include <GL/glew.h> #include <SFML/OpenGL.hpp> #include <iostream> #include <SFML/Window.hpp> #include <glm/glm.hpp> #include <gl

我知道以前有人问过这个问题,但其他答案都不能解决我的具体问题。我有一个简单的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;
}
以下是我的着色器:

(顶点着色器)

(片段着色器)


我要澄清的是,我的图像是一个PNG,它是256x256(2倍大小),实际上它有透明像素。

您从未设置混合函数。您可能会认为您需要执行以下呼叫:

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\u INVALID\u ENUM

这是一个有效的编程问题。请不要投票关闭它。调试提示:在加载纹理后,通过gDEBugger或CodeXL运行您的程序,查看内部数据是否正确…或者更好,使用调试器(gDEBugger或CodeXL)谢谢,这就是问题所在!我使用的是glAlphaFunc()而不是glBlendFunc()。现在可以了!
#version 450

in vec3 color;
in vec2 texCoord;

out vec4 f_color;

uniform sampler2D texture;

void main()
{
    f_color=texture2D(texture, texCoord);
}
glAlphaFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);