我将sampler2d制服从我的代码传递到着色器时遇到了麻烦。我的着色器中有这一行:
uniform sampler2D u_texture;
在代码中,我使用的是在blender中创建的g3db模型(带纹理):
AssetManager assets = new AssetManager();
assets.load(data+"/earth.g3db", Model.class);
assets.finishLoading();
Model earthModel = assets.get(data+"/earth.g3db", Model.class);
earthPlanet = new ModelInstance(earthModel,0,-1,0);
我使用modelBatch:
渲染它 modelBatch.begin(cam);
modelBatch.render(earthPlanet, shader);
modelBatch.end();
我的代码中有着色器类,并且有一个渲染方法:
public void render(Renderable renderable) {
program.setUniformMatrix(u_worldTrans, renderable.worldTransform);
//how to pass texture??
//program.setUniformf(sampler2D, ????);
renderable.mesh.render(program,
renderable.primitiveType,
renderable.meshPartOffset,
renderable.meshPartSize);
}
我很乐意回应任何问题。谢谢!
答案 0 :(得分:4)
您的困惑源于您认为将纹理传递给采样器制服的事实。事实并非如此。
当您为采样器制服赋予值时,您应提供的值是纹理单位。假设你有一个纹理并将其绑定到GL_TEXTURE0
,那么你会给采样器统一值:0
。顺便说一句,一般来说,您将采样器视为整数制服,因此正确的代码可能是:program.setUniformi (sampler2D, 0);
这告诉GLSL采样器将使用纹理单元0,使用的实际纹理将取决于绑定到该纹理单元的任何内容。