2016-06-16 8 views
-1

私は初めてOpenGLで基本的なゲームを作っています。しかし、私はスプライトにロードしてからレンダリングするときに問題に遭遇しました。何度か追加ピクセルが追加され、透明または背景を表示する必要があります。OpenGL/C++の不正なピクセルがレンダリングされています

#include "texture.h" 

#define STB_IMAGE_IMPLEMENTATION 

#include "stb_image.h" 
#include <iostream> 

Texture::Texture() 
{ 

} 

Texture::~Texture() 
{ 
    glDeleteTextures(1, &_texture); 
} 

void Texture::Init(const std::string& filename) 
{ 
    int width, height, numComponents; 
    unsigned char* data = stbi_load(filename.c_str(), &width, &height, 
            &numComponents, 4); 
    if (data == NULL) 
     std::cerr << "Unable to load texture: " << filename << std::endl; 

    glGenTextures(1, &_texture); 
    glBindTexture(GL_TEXTURE_2D, _texture); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

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

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 
       0, GL_RGBA, GL_UNSIGNED_BYTE, data); 
    stbi_image_free(data); 
} 

void Texture::Bind(unsigned int unit) 
{ 
    glBindTexture(GL_TEXTURE_2D, _texture); 
} 

void Texture::DelTexture() 
{ 
    glDeleteTextures(1, &_texture); 
} 

EDIT:ここ

は私の質感コードですこれは、私が選手をレンダリングするために使用したコードです:

#include "Player.h" 

#include <iostream> 
#include <glm/glm.hpp> 

Player::Player(std::string texLocation) 
{ 
    Vertex vertices[] = { 
     Vertex(glm::vec3(0.0033325 * 9, 0.0033325 * 14, 0.0f), 
     glm::vec2(0.0f, 0.0f)), 
     Vertex(glm::vec3(0.0033325 * 9, -0.0033325 * 14, 0.0f), 
     glm::vec2(0.0f, 1.0f)), 
     Vertex(glm::vec3(-0.0033325 * 9, -0.0033325 * 14, 0.0f), 
     glm::vec2(1.0f, 1.0f)), 
     Vertex(glm::vec3(-0.0033325 * 9, 0.0033325 * 14, 0.0f), 
     glm::vec2(1.0f, 0.0f)) 
}; 

    _mesh.Init(vertices, sizeof(vertices)/sizeof(vertices[0])); 
    _texture.Init(texLocation); 
} 

Player::~Player() 
{ 
} 

void Player::Bind(Texture* tex) 
{ 
    tex->Bind(0); 
} 

void Player::BindHealth() 
{ 
    _heTexture.Bind(0); 
} 

void Player::Render() 
{ 
    _mesh.Draw(); 
} 

そして、この問題は、たまに発生し、Iただそれをプレーヤーに気づいただけです。

答えて

0

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)を取り出し、何が起こるかを報告します。

+0

何も変更されていないようですが、これは、画面の中央から離れた場合にのみ発生します。また、私はちょうどそれが頭であるスプライトの上部に起こっていることに気づいた。 – Smile

+0

イメージは正しくフォーマットされていますか?つまり、以前はppmファイルで問題が発生していて、それぞれの色ごとにアルファチャンネルを正しく設定していました。いくつかの部分が適切に透明であるか、またはすべてが正しくレンダリングされていませんか? stbi_loadのコードは何ですか? –

+0

私が使用している画像フォーマットはPNGで、その他のものはうまく動作しているようですが、必ずしもそれが起こるとは言いません。次に、stbi_loadを持つ画像ローダーstbi_image.hへのリンクを示します。https://github.com/nothings/stb/blob/master/stb_image.h – Smile

関連する問題