2016-05-14 1 views
3

[目的] OpenGL 4+のCubeMap固有のミップマップレベルに書き込む必要があります。各ミップマップレベルぼやけより深いレベルがされています。OpenGL Cubemap:ミップマップへの書き込み

[問題]問題は、レベル0のみに書き込むとすべてのミップマップレベルで同じ画像が表示され、他のミップマップレベルでは書き込もうとすると全く画像がありません。

[更新]私はこの問題は、常に私はそれを介して取得しようとするどのようなミップマップレベルLOD 0ベースにクランプし、それがベースLODを返すtextureLodあるかなり確信しています。ここで

(私はベースを数え、6つのミップマップレベルを持ってしようとしている)私のキューブマップの生成である:

GLuint PreFilteredEnvTex; 
glGenTextures(1, &PreFilteredEnvTex); 
glBindTexture(GL_TEXTURE_CUBE_MAP, PreFilteredEnvTex); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 5); 
for (int i = 0; i < 6; ++i) 
{ 
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB16F, 512, 512, 0, GL_RGB, GL_FLOAT, 0); 
} 
glGenerateMipmap(GL_TEXTURE_CUBE_MAP); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 

Utils::checkGlError("Generate PreFilteredEnvMap"); 

そしてここで、各ミップマップレベルに書き込むための私の試みの例:

//Compute pre filtered environnement maps 
glDisable(GL_CULL_FACE); 
glDisable(GL_BLEND); 
glDisable(GL_DEPTH_TEST); 
glBindFramebuffer(GL_FRAMEBUFFER, fboManager["fx"]); 
glViewport(0, 0, screenWidth, screenHeight); 
glClear(GL_COLOR_BUFFER_BIT); 

const int MIPMAPLEVELS = 6; 
const int MIPMAPBASELEVELSIZE = 512; 
int MipMapTextureSize; 
glBindVertexArray(vaoManager["cube"]); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->texture_id); 
Shader* PreEnvFilter = shaderManager["PreEnvFilter"]; 
PreEnvFilter->use(); 

glm::vec3 EyePosition = glm::vec3(0.f); 
// Light space matrices 
glm::mat4 CubeMapProjection = glm::perspective(glm::radians(90.f), 1.f, 1.f, 100.f); 
std::vector<glm::mat4> worldToLight; 
worldToLight.push_back(CubeMapProjection * glm::lookAt(EyePosition, EyePosition + glm::vec3(1.0, 0.0, 0.0), glm::vec3(0.0, -1.0, 0.0))); 
worldToLight.push_back(CubeMapProjection * glm::lookAt(EyePosition, EyePosition + glm::vec3(-1.0, 0.0, 0.0), glm::vec3(0.0, -1.0, 0.0))); 
worldToLight.push_back(CubeMapProjection * glm::lookAt(EyePosition, EyePosition + glm::vec3(0.0, 1.0, 0.0), glm::vec3(0.0, 0.0, 1.0))); 
worldToLight.push_back(CubeMapProjection * glm::lookAt(EyePosition, EyePosition + glm::vec3(0.0, -1.0, 0.0), glm::vec3(0.0, 0.0, -1.0))); 
worldToLight.push_back(CubeMapProjection * glm::lookAt(EyePosition, EyePosition + glm::vec3(0.0, 0.0, 1.0), glm::vec3(0.0, -1.0, 0.0))); 
worldToLight.push_back(CubeMapProjection * glm::lookAt(EyePosition, EyePosition + glm::vec3(0.0, 0.0, -1.0), glm::vec3(0.0, -1.0, 0.0))); 
for (GLuint i = 0; i < 6; ++i) 
    PreEnvFilter->SetMatrix4(("ViewMatrix[" + to_string(i) + "]").c_str(), worldToLight[i]); 
PreEnvFilter->SetInt("EnvMapSampler", 0); 
PreEnvFilter->SetMatrix4("Model", glm::mat4()); 
//For each faces compute all mipmaps levels 
for (unsigned int j = 0; j < MIPMAPLEVELS; ++j) 
{ 
    //For each mipmap level, render the filtered environnement in it 
    MipMapTextureSize = std::max(1, MIPMAPBASELEVELSIZE/(1 << j)); 
    glViewport(0, 0, MipMapTextureSize, MipMapTextureSize); 
    //glViewport(0, 0, MIPMAPBASELEVELSIZE, MIPMAPBASELEVELSIZE); 
    float roughness = (j + 0.5f)/MIPMAPLEVELS; 
    PreEnvFilter->SetFloat("Roughness", roughness); 
    //Bind to the current buffer 
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, PreFilteredEnvTex, j); 
    glDrawElements(GL_TRIANGLES, 12 * 3, GL_UNSIGNED_INT, (void*)0); 
} 

PreEnvFilter->unuse(); 
glEnable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_BLEND); 

Utils::checkGlError("Initialize PreFilteredEnvMap"); 

私はすべてのミップマップレベルを超えるループのみのベースレベルに描いてる場合、私は格好良い結果があるので、私は、私のシェーダが動作していると確信している: The result if I'm only writing to level 0 for all mipmap levels

を210

キューブマップは、次のフラグメントシェーダ(TexCoordsは私が描きたい顔に応じて変更される)が印刷されている:

#version 430 

uniform int MipMapLevel; 
uniform samplerCube CubeMap; 
in vec3 TexCoords; 
out vec4 Color; 

void main() 
{ 
    Color = textureLod(CubeMap, TexCoords, MipMapLevel); 
} 

そして、私はすべてのミップマップレベルに書いているならば、私はすべてに同じイメージを持っていますミップマップレベル(私はレベル0に書き込む場合、実際に私も、すべてのミップマップレベルで同じ結果を持っている)

Same result, different mipmap levels

以下のように私の結論は次のとおりです。

  • 私のミップマップの生成は良くありませんが、スペックを読み、glGenerateMipmapがジョブを完了している必要があります
  • ミップマップレベルからglFramebufferTextureをバインドしようとすると問題が発生しますが、私
  • 私はそれが必要だと思うように動作していないキューブマップを描画するための私のシェーダ?私は前にtextureLodを使用したことがありませんが、私の知る限り、私は右、右ここでそれを使用していますか?

誰かが既に同様のものを行っている場合、私はいくつかの助けを本当に感謝! OpenGLは

+0

2 observations 1.シェーダーパラメータ 'MipMapLevel'を決して設定しません。 2. 'j'の代わりにglFrameBufferTextureにレベルとして定数 '5'を渡します。 – denniskb

+0

2.私は実際にjを渡しています。2.ミップマップレベル5で何か書いたかどうかを調べるために5でテストしましたが、そうではありません。 1.については、あまり明確ではないかもしれませんが、あなたが参照しているシェーダは質問の画像を生成したシェーダだけです(私の "デバッグ描画"のみ)。プログラムで使用されているシェーダはもっと複雑ですが、私が言ったように、私は100%確実に動作しています。 – Toffanim

+0

[glFrameBufferTexture2D](https://www.opengl.org/sdk/docs/man/html/glFramebufferTexture.xhtml)が必要です。描画するキューブマップの面を指定できます。これは、2つのネストされたループを持つ必要があることを意味します。すべての6つのフェイス、すべてのミップマップレベル、 6 * #mipmap_levelsが呼び出しを描画します。 – denniskb

答えて

0

しようとした後、すべてのエラーを報告しません:私はそれに費やしたすべての時間の後、私はまだ、私はそれをやったときDX11 :(

PSに問題がwhithout OpenGLでこの単純なことを行うことができないんだけどほとんどすべてが、私は最終的に、それは次のように私のキューブマップを生成することで動作しますしました:

GLuint PreFilteredEnvTex; 
glGenTextures(1, &PreFilteredEnvTex); 
glBindTexture(GL_TEXTURE_CUBE_MAP, PreFilteredEnvTex); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 5); 

for (int i = 0; i < 6; ++i) 
{ 
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB16F, 512, 512, 0, GL_RGB, GL_FLOAT, 0); 
} 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 
glGenerateMipmap(GL_TEXTURE_CUBE_MAP); 

私はGL_LINEAR_MIPMAP_LINEARに分フィルタを変更し、代わりにthis linkのように行うので、最後にglGenerateMipmapを呼び出しました。

ありがとうございました:)

関連する問題