簡體   English   中英

OpenGL 4.0 Cubemap問題

[英]OpenGL 4.0 Cubemap issues

正在閱讀“ OpenGL 4.0着色語言食譜”。 但是我在立方貼圖教程中遇到了麻煩。

問題是我正在繪制的模型完全顯示為灰色。 好像沒有從samplerCube紋理中獲取任何數據。

我所有的代碼似乎都是正確的。 我看過其他教程,也是一樣。 不知道我的Intel HD Graphics 4000是否負責,但是我已經確定我確實具有GL_ARB_texture_cube_map擴展名。

我正在使用DevIL庫從文件加載圖像,這似乎還不錯,但是據我所知,將數據傳輸到OpenGL時出現了問題。

我正在發布加載文件,從文件中獲取數據。 所有文件也正確加載。 我還要發布繪圖代碼,將紋理綁定到管道。 而且我還發布了頂點和片段着色器,以防萬一,但是它們確實可以正常工作。

有任何想法嗎?

正在加載代碼

uint TARGETS[6] =
{
    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
};
string EXTS[6] = 
{
    "posx",
    "negx",
    "posy",
    "negy",
    "posz",
    "negz"
};

// Create & bind cubemap texture
glGenTextures( 1, &cubemap );
glBindTexture( GL_TEXTURE_CUBE_MAP, cubemap );

for( int i = 0; i < 6; i++ )
{
    string file = "textures/cubemap_" + EXTS[i] + ".png";
    uint image = ilGenImage();

    // Load with DevIL
    ilBindImage( image );
    if( !ilLoadImage( file.c_str() ) )
    {
        cout << "ERROR: Failed to load image " << endl;
        return false;
    }

    // Fetch info from DevIL
    int width   = ilGetInteger( IL_IMAGE_WIDTH );
    int height  = ilGetInteger( IL_IMAGE_HEIGHT );
    uint format = ilGetInteger( IL_IMAGE_FORMAT );
    uint type   = ilGetInteger( IL_IMAGE_TYPE );

    // Send data to OpenGL  
    glTexImage2D(
        TARGETS[i],
        0,
        GL_RGBA,
        width,
        height,
        0,
        format,
        type,
        ilGetData() );

    // Error check
    if( !ErrorCheck("Failed to bind a side of the cubemap!") )
        return false;

    // Get rid of DevIL data
    ilDeleteImage( image );
}

// Parameters
glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE );

抽獎碼

    // Update
glfwPollEvents();
UpdateTime();

// Clear back buffer for new frame
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


// Bind shader
shader->Bind();

// Cubemap
shader->SetUniform( "cubemapTexture", 0 );
glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_CUBE_MAP, cubemap );

// Bind model
if( model->Bind() )
{
    static float angle = 0;
    angle += 25.0f * deltaTime;

    // Matrices
    mat4 world =
            translate( vec3( 0.0f, 0.0f, 0.0f) ) *
            rotateZ( angle * PI / 180 ) *
            rotateX( angle * PI / 180 ) *
            scale( vec3( 1.0f, 1.0f, 1.0f) );
    mat4 view = ViewMatrix(
            cameraPosition,
            cameraTarget,
            vec3( 0.0f,  0.0f,  1.0f) );
    mat4 proj = ProjectionMatrix(
            fov,
            (float)windowX,
            (float)windowY,
            nearPlane,
            farPlane );

    // Uniforms
    shader->SetUniform( "uWorld", world );
    shader->SetUniform( "uView", view );
    shader->SetUniform( "uProj", proj );

    shader->SetUniform( "materialColor", vec3( 0.5f, 0.5f, 0.5f ) );

    shader->SetUniform( "drawSkybox", false );
    shader->SetUniform( "world_cameraPosition", cameraPosition );
    shader->SetUniform( "reflectFactor", 0.5f );

    // Draw
    glDrawElements( GL_TRIANGLES, model->GetIndexCount(), GL_UNSIGNED_SHORT, NULL );
}

// Put the new image on the screen
glfwSwapBuffers( window );

頂點着色器

#version 400

layout(location=0) in vec3 vertex_position;
layout(location=1) in vec3 vertex_normal;
layout(location=2) in vec4 vertex_tangent;
layout(location=3) in vec2 vertex_texCoords;

out vec2 texCoords;
out vec3 reflectDir;

uniform mat4 uWorld;
uniform mat4 uView;
uniform mat4 uProj;

uniform bool drawSkybox;
uniform vec3 world_cameraPosition;

void main()
{
    if( drawSkybox )
    {
        reflectDir = vertex_position;
    }
    else
    {
        vec3 world_pos = vec3( uWorld * vec4(vertex_position,1.0) );
        vec3 world_norm = vec3( uWorld * vec4(vertex_normal,0.0) );
        vec3 world_view = normalize( world_cameraPosition - world_pos );

        reflectDir = reflect( -world_view, world_norm );
    }

    gl_Position = uProj * uView * uWorld * vec4(vertex_position,1.0);
    texCoords = vertex_texCoords;
}

片段着色器

#version 400

out vec4 fragColor;

in vec2 texCoords;
in vec3 reflectDir;

uniform samplerCube cubemapTexture;

uniform vec3 materialColor;
uniform bool drawSkybox;
uniform float reflectFactor;

void main()
{
    vec3 color = texture( cubemapTexture, reflectDir ).rgb;

    if( drawSkybox )
    {
        fragColor = vec4( color, 1.0 );
    }
    else
    {
        fragColor = vec4( mix( materialColor, color, reflectFactor ), 1.0 );
    }
}

您的立方體貼圖紋理不完整。 必須指定所有6個面,立方體圖紋理才能完整。 從規格:

此外,如果滿足以下所有條件,則立方體貼圖紋理將是立方體完整的:[..]組成立方體貼圖的六個紋理圖像的每一個的level_base數組均具有相同,正和正方形的尺寸。

您的代碼未指定NEGATIVE_X的圖片:

uint TARGETS[6] =
{
    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
};

使用此表,為NEGATIVE_Y的圖像指定了兩次,但缺少NEGATIVE_X 它應該是:

uint TARGETS[6] =
{
    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
};

除了列舉6個目標外,還可以使用GL_TEXTURE_CUBE_MAP_POSITIVE_X + i iGL_TEXTURE_CUBE_MAP_POSITIVE_X + i范圍內的i來尋址6個目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM