0

GLEW+GLFWを使用するときに問題が発生します...使用する順序は次のとおりです。

  1. GLFWをロードし、ウィンドウを開きます
  2. Init GLEW
  3. シェーダーをコンパイルする
  4. テクスチャを作成する
  5. フレームバッファを作成する

これが私のコードのすべての流れです:

if( !glfwInit() )
{
    glfwTerminate();
    throw exception( "Failed to initialize GLFW" );
}

glfwOpenWindowHint( GLFW_FSAA_SAMPLES, 4 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );

if( !glfwOpenWindow( m_width, m_height, 0, 0, 0, 0, 32, 0, GLFW_WINDOW ) )
{
    throw exception( "Failed to open GLFW window." );
    glfwTerminate();
}

if ( glewInit() != GLEW_OK )
{
    throw exception( "Failed to initialize GLEW" );
}

// shaders...
compile some shaders.... glCreateShader(), glCompileShader(), glCreateProgram(), glAttachShader() glLinkProgram(), etc...

// texture
glGenTextures( 1, &m_texture );
glBindTexture( GL_TEXTURE_2D, m_texture );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

// frame buffer
glGenFramebuffers( 1, &m_frameBuffer ); // IT CRASHES HERE! :-(
glBindFramebuffer( GL_FRAMEBUFFER, m_frameBuffer );

glBindTexture( GL_TEXTURE_2D, m_texture );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glFramebufferTexture( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_texture, 0 );

GLenum drawBuffers[ 1 ] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers( 1, drawBuffers );

if ( glCheckFramebufferStatus( GL_FRAMEBUFFER ) != GL_FRAMEBUFFER_COMPLETE )
{
    throw exception( "Problems when creating OpenGL texture in GPU!" );
}

このフローは完全に実行されます。つまり、クラッシュや例外のスローはありません...しかし、フレームバッファーに何かを描画して読み戻すと、すべてが黒くなります。

詳細:GLFWを使用しないことを除いて、上記とまったく同じ手順の別のバージョンがあります...つまり:自分でウィンドウを作成し、OpenGLコンテキストを作成します...すべてが完全に機能します!シェーダーがコンパイルされて正常に実行され、テクスチャが作成され、フレームバッファーが作成され、レンダリングして完全に元に戻します...しかし、GLFWを配置すると、テクスチャへのレンダリングが機能しなくなりました...何か考えはありますか?

4

1 に答える 1

1

glfwMakeContextCurrent(window);でコンテキストを切り替えていません。

GLFWとGLEWの完全な初期化の例を次に示します。

//Init GLFW
if(!glfwInit())
{
    std::cout << "ERROR"  << std::endl; 
    return(-1);
}

//Give hints
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
glfwWindowHint(GLFW_VISIBLE, GL_TRUE);
glfwWindowHint(GLFW_DECORATED, GL_TRUE);
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);

#if defined(__APPLE__)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
int const DPI = 2; // For retina screens only
#else
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE);
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
int const DPI = 1;
# endif

// Create Wikndow
window = glfwCreateWindow(screenWidth, screenHeight, "DEMO", NULL, NULL );
if(window == 0)
{
    std::cout << "ERROR"  << std::endl;
    glfwTerminate();
    return(-1);
}

//Switch context to use on window
glfwMakeContextCurrent(window);

//Init glew
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
    std::cout << "ERROR" << std::endl;
    return(-1);
}
于 2016-05-15T15:38:36.713 に答える