2016-09-03 11 views
2

これは以前に尋ねられたことは知っていますが、他の回答は私の特定の問題に役立ちません。私はテクスチャキューブを描いているシンプルなC++とOpenGLプログラムを持っています。テクスチャの透明度が黒く表示されます。私は私が間違って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の累乗)であり、実際には透明ピクセルを持っています。

+0

これは有効なプログラミングの質問です。それを閉じるために投票しないでください。 –

+0

デバッグのヒント:gDEBuggerまたはCodeXLを使用してプログラムを実行し、テクスチャをロードした後に内部データが正しいかどうかを確認します。 – Andreas

答えて

2

ブレンド機能は設定しません。あなたは次の呼び出しで行うだと思うことがあります。

glAlphaFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

しかし、それは別の何かです。この呼び出しは、アルファテスト機能を設定するために使用されます。それが何であるか分からなければ...気にしないでください。アルファテストは、OpenGLコアプロファイルではサポートされなくなった機能の廃止予定です。実際には、固定機能のOpenGLで非常に便利なケースもありましたが、プログラム可能なパイプラインで簡単に実装できるため、専用のアルファテストは本当に必要なくなりました。あなたがブレンド機能を設定するために呼び出すと思った何

です:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

すると期待どおり常にコールglGetError()は、あなたのOpenGLのコードが動作しない場合ことを確認してください。この場合、glAlphaFunc()glBlendFunc()とは異なる引数を取るため、すぐにエラーになります。したがって、はすぐにGL_INVALID_ENUMを返していました。

+0

...またはそれ以上に、デバッガ(gDEBuggerまたはCodeXL)を使用してください – Andreas

+0

ありがとう、それは問題でした! glBlendFunc()の代わりにglAlphaFunc()を使っていました。それは今働きます! –