/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.renderscript; import android.util.Log; /** *
ProgramFragmentFixedFunction is a helper class that provides * a way to make a simple fragment shader without writing any * GLSL code. This class allows for display of constant color, interpolated * color from the vertex shader, or combinations of the both * blended with results of up to two texture lookups.
= MAX_TEXTURE)) { throw new IllegalArgumentException("MAX_TEXTURE exceeded."); } mSlots[slot] = new Slot(env, fmt); return this; } /** * Specifies whether the texture coordinate passed from the * vertex program is replaced with an openGL internal point * sprite texture coordinate * **/ public Builder setPointSpriteTexCoordinateReplacement(boolean enable) { mPointSpriteEnable = enable; return this; } /** * Specifies whether the varying color passed from the vertex * program or the constant color set on the fragment program is * used in the final color calculation in the fixed function * fragment shader * **/ public Builder setVaryingColor(boolean enable) { mVaryingColorEnable = enable; return this; } /** * Creates the fixed function fragment program from the current * state of the builder. * */ public ProgramFragmentFixedFunction create() { InternalBuilder sb = new InternalBuilder(mRS); mNumTextures = 0; for(int i = 0; i < MAX_TEXTURE; i ++) { if(mSlots[i] != null) { mNumTextures ++; } } buildShaderString(); sb.setShader(mShader); Type constType = null; if (!mVaryingColorEnable) { Element.Builder b = new Element.Builder(mRS); b.add(Element.F32_4(mRS), "Color"); Type.Builder typeBuilder = new Type.Builder(mRS, b.create()); typeBuilder.setX(1); constType = typeBuilder.create(); sb.addConstant(constType); } for (int i = 0; i < mNumTextures; i ++) { sb.addTexture(TextureType.TEXTURE_2D); } ProgramFragmentFixedFunction pf = sb.create(); pf.mTextureCount = MAX_TEXTURE; if (!mVaryingColorEnable) { Allocation constantData = Allocation.createTyped(mRS,constType); FieldPacker fp = new FieldPacker(16); Float4 f4 = new Float4(1.f, 1.f, 1.f, 1.f); fp.addF32(f4); constantData.setFromFieldPacker(0, fp); pf.bindConstants(constantData, 0); } return pf; } } }