[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纹理失效。
你知道它可能是什么吗?
答案 0 :(得分:0)
此代码没有任何问题。我的着色器类没有正确加载制服。