2013-06-17 26 views
6

sdl2テクスチャをglslシェーダにバインドしようとしていますが、どうしたらよいか分かりません。私はglfxというライブラリを使ってglslシェーダを処理しています。このライブラリの開発にも協力しています。 SDL_GL_BindTextureを呼び出すと、それ以外のものはすべて得られていると確信していますが、クラッシュします。誰かが私が間違って行ったことを見ることができますか?GLSLシェーダにSDL2テクスチャをバインドする

#include <stdio.h> 
#include <stdlib.h> 
#include <vector> 
#include <string> 
#include <GL/glew.h> 
#include <GL/glfx.h> 
#include <SDL2/SDL.h> 
#include <FreeImage.h> 

int main() 
{ 
    SDL_Window *mainwindow; 
    SDL_Renderer *renderer; 
    SDL_GLContext maincontext; 

    SDL_Init(SDL_INIT_VIDEO); 

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 

    SDL_CreateWindowAndRenderer(512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN, &mainwindow, &renderer); 

    maincontext = SDL_GL_CreateContext(mainwindow); 

    glewExperimental = GL_TRUE; 
    glewInit(); 
    fprintf(stdout, "%s\n", glGetString(GL_VERSION)); 
    fprintf(stdout, "%s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); 

    FIBITMAP* dib = FreeImage_Load(FIF_PNG, "test.png"); 
    uint32_t w = FreeImage_GetWidth(dib); 
    uint32_t h = FreeImage_GetHeight(dib); 

    dib = FreeImage_ConvertTo32Bits(dib); 

    BYTE* pixeles = FreeImage_GetBits(dib); 
    GLubyte* textura = new GLubyte[4*w*h]; 

    SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, w, h); 

    const SDL_Rect rect = { 0, 0, w, h }; 
    int pitch = 32; 
    SDL_LockTexture(texture, &rect, (void**)&textura, &pitch); 

    for(uint32_t j = 0; j < w * h; j++) 
    { 
     textura[j*4+0] = pixeles[j*4+2]; 
     textura[j*4+1] = pixeles[j*4+1]; 
     textura[j*4+2] = pixeles[j*4+0]; 
     textura[j*4+3] = pixeles[j*4+3]; 
    } 
    SDL_UnlockTexture(texture); 

    FreeImage_Unload(dib); 

    delete [] textura; 

    int effect = glfxGenEffect(); 

    std::string shader; 

    shader ="struct VSinput\n" 
      "{\n" 
      " vec3 Position;\n" 
      "};\n" 

      "shader VSmain(in VSinput VSin, out vec2 TexCoord)\n" 
      "{\n" 
      " gl_Position = vec4(VSin.Position, 1.0);\n" 
      " TexCoord = vec2(0.8, 0.8);\n" 
      "};\n" 

      "uniform sampler2D gColorMap;\n" 

      "shader FSmain(in vec2 TexCoord, out vec4 FragColor)\n" 
      "{\n" 
      " FragColor = texture(gColorMap, TexCoord);\n" 
      "}\n" 

      "program SimpleTechnique\n" 
      "{\n" 
      " vs(150) = VSmain();\n" 
      " fs(150) = FSmain();\n" 
      "};\0"; 

    glfxParseEffectFromMemory(effect, shader.c_str()); 
    int shaderProg = glfxCompileProgram(effect, "SimpleTechnique"); 
    if (shaderProg < 0) 
    { 
     std::string log = glfxGetEffectLog(effect); 
     fprintf(stderr, "%s\n", log.c_str()); 
    } 

    glClearColor (0.0, 0.0, 1.0, 1.0); 
    glClear (GL_COLOR_BUFFER_BIT); 

    float* vert = new float[9]; 

    vert[0] = 0.0; vert[1] = 0.5; vert[2] =-1.0; 
    vert[3] =-1.0; vert[4] =-0.5; vert[5] =-1.0; 
    vert[6] = 1.0; vert[7] =-0.5; vert[8] =-1.0; 

    unsigned int m_vaoID; 
    unsigned int m_vboID; 

    glGenVertexArrays(1, &m_vaoID); 
    glBindVertexArray(m_vaoID); 

    glGenBuffers(1, &m_vboID); 

    glBindBuffer(GL_ARRAY_BUFFER, m_vboID); 
    glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), vert, GL_STATIC_DRAW); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(0); 

    glEnable(GL_TEXTURE_2D); 

    int loc = glGetUniformLocation(shaderProg, "gColorMap"); 

    glActiveTexture(GL_TEXTURE0); 

    SDL_GL_BindTexture(texture, NULL, NULL); 

    glUniform1i(loc, 0); 

    glUseProgram(shaderProg); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 

    glBindVertexArray(0); 

    delete[] vert; 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glDeleteBuffers(1, &m_vboID); 
    glDeleteVertexArrays(1, &m_vaoID); 

    SDL_GL_SwapWindow(mainwindow); 
    SDL_Delay(2000); 

    SDL_GL_DeleteContext(maincontext); 
    SDL_DestroyWindow(mainwindow); 
    SDL_Quit(); 

    return 0; 
} 
+0

SDL2のデバッグ版をビルドし、 'SDL_GL_BindTexture()'がどこでクラッシュしているかを調べます。 – genpfault

+0

ここでクラッシュします:data-> glEnable(texturedata-> type); 理由がわかりません。 – SteveDeFacto

答えて

1

glUniform - 周りに他の方法、glUniform1i()次いで

glUseProgram()ための現在のプログラムオブジェクトを均一変数の値を指定しません。

EDITa bug in SDL2のようになります。レポートに添付したデモプログラムを試してみて、システムで再解析できるかどうかを確認してください。

EDIT2:Samのように見えます。a fix inです。

+0

私はSDLを実装する前にOpenGLの部分をテストし、うまくいきました。とにかくあなたが言ったことを確かめて何も変えなかった。 – SteveDeFacto

+0

@SteveDeFacto:編集済み。 – genpfault

+0

私は文字通りそれを行うために50の異なる方法を試みましたが、何も機能していませんでした。 SDL2の最新バージョンに更新され、今すぐ完璧に動作します!ありがとうございました! – SteveDeFacto

関連する問題