Opengl glsl不能混合2d纹理和3d纹理

时间:2014-06-18 09:36:38

标签: c++ opengl textures glsl fragment-shader

[Edit2]:这段代码没什么问题。我的着色器类没有正确加载制服。

[编辑]:似乎我只能出于某种原因使用GL_TEXTURE0 /纹理单元0。 我想要的是绘制2d纹理和3d纹理,但只有纹理单元0(GL_TEXTURE_0)的纹理才有效。我在着色器中同时使用它们,我无法使用该着色器看到任何内容。

这是我想要使用的片段着色器代码:

#version 330 core

// Interpolated values from the vertex shaders
in vec3 fragmentColor;
in vec3 fragmentPosition;

// Ouput data
out vec3 color;

uniform sampler3D textureSampler3D;

uniform sampler2D textureSampler2D;

float getInputLight(vec3 pos);

void main(){
    // Get the nearest corner
    vec3 cornerPosition = vec3(round(fragmentPosition.x), round(fragmentPosition.y), round(fragmentPosition.z));

    float light = getInputLight(cornerPosition);

    color = (0.5+16*light)*fragmentColor;

}

float getInputLight(vec3 pos) {
    if (pos.z <= 0.f)
        return texture2D(textureSampler2D, vec2(pos.x/16, pos.y/16)).r;

    return texture(textureSampler3D, vec3(pos.x/16, pos.y/16, pos.z/16)).r;
}

但是由此我无法看到该着色器所做的任何事情。如果我使用它,我可以看到2d纹理的作用。

float getInputLight(vec3 pos) {
    if (pos.z <= 0.f)
        return texture(textureSampler2D, vec2(pos.x/16, pos.y/16)).r;
    return 0.f;
}

如果我使用它,它将完美地工作,除了我只有3d纹理:

float getInputLight(vec3 pos) {
    return texture(textureSampler3D, pos/16).r;
}

这意味着我只能在着色器上使用其中一个纹理。当我说我使用3d纹理然后我改变了getInputLight所以我只使用了3d纹理。我用2d纹理做同样的事情,除了我把它改成另一个版本。

这是我用来加载3d纹理的c ++代码:

glGenTextures(1, &m_3dTextureBuffer);
glBindTexture(GL_TEXTURE_3D, m_3dTextureBuffer);

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, voxelMatrixWidth, voxelMatrixHeight, voxelMatrixDepth, 0, GL_RED, GL_UNSIGNED_BYTE, (GLvoid*)m_lightData);

这是我用来加载2d纹理的代码:         GLuint缓冲区;

    unsigned char *voidData = new unsigned char[256];
            // With this I can see if the shader has right data.
    for (int i = 0; i < 256; ++i)
        voidData[i] = i%16;

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

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 16, 16, 0, GL_RED, GL_UNSIGNED_BYTE, (GLvoid*)voidData);
            m_3dTextureBuffer = buffer;

这是我在绘制顶点缓冲区之前运行的代码:

GLint texture3dId = shader->getUniform(1);

GLint texture2dId = shader->getUniform(2);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, m_3dTextureBuffer);
glUniform1i(texture3dId, 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_2dTextureBuffer);
//glUniform1i(texture3dId,1);

如果我对2d纹理和3d纹理使用纹理单元0(TEXTURE0),我会得到我期望的数据/像素。 这是它的图片,这是我的期望:

http://oi57.tinypic.com/3wrbd.jpg

如果我使用不同的单位,我会得到这个随机数据并且有时会出现失真(每个像素都会变成黑色/ 0表示帧)。随机数据也不会改变。如果你向某个方向看,它不会闪烁,而某些方向的闪光速度会比其他方向快。

http://oi58.tinypic.com/2ltiqoo.jpg

当我交换3d纹理的纹理单元时,2d纹理会发生同样的事情,但是2d纹理会使3d纹理失效。

你知道它可能是什么吗?

1 个答案:

答案 0 :(得分:0)

此代码没有任何问题。我的着色器类没有正确加载制服。