diff options
author | Alex Sakhartchouk <alexst@google.com> | 2010-09-30 11:36:37 -0700 |
---|---|---|
committer | Alex Sakhartchouk <alexst@google.com> | 2010-09-30 11:36:37 -0700 |
commit | f5b3510c706ed1f7611760dff0c94f2111531c68 (patch) | |
tree | 05d2f7976a7ec1000a5ad0ee035151704da8a49c /libs/rs/java/Samples/src | |
parent | e224fabb2c59e9f1274c3569c04b91787824add0 (diff) | |
download | frameworks_base-f5b3510c706ed1f7611760dff0c94f2111531c68.zip frameworks_base-f5b3510c706ed1f7611760dff0c94f2111531c68.tar.gz frameworks_base-f5b3510c706ed1f7611760dff0c94f2111531c68.tar.bz2 |
Adding anisotropic filtering and related samples.
Change-Id: Idb173274417feb5e25bfd64c5e9fa2492a23a17e
Diffstat (limited to 'libs/rs/java/Samples/src')
-rw-r--r-- | libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java | 27 | ||||
-rw-r--r-- | libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs | 82 |
2 files changed, 99 insertions, 10 deletions
diff --git a/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java b/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java index d4e83d3..a15c4a1 100644 --- a/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java +++ b/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java @@ -19,11 +19,12 @@ package com.android.samples; import java.io.Writer; import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.renderscript.*; import android.renderscript.ProgramStore.DepthFunc; +import android.renderscript.Sampler.Value; import android.util.Log; -import android.graphics.BitmapFactory; -import android.graphics.Bitmap; public class RsRenderStatesRS { @@ -42,7 +43,7 @@ public class RsRenderStatesRS { mOptionsARGB.inScaled = false; mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888; mMode = 0; - mMaxModes = 8; + mMaxModes = 9; initRS(); } @@ -53,6 +54,8 @@ public class RsRenderStatesRS { private Sampler mLinearWrap; private Sampler mMipLinearWrap; private Sampler mNearestClamp; + private Sampler mMipLinearAniso8; + private Sampler mMipLinearAniso15; private ProgramStore mProgStoreBlendNoneDepth; private ProgramStore mProgStoreBlendNone; @@ -74,10 +77,12 @@ public class RsRenderStatesRS { private ProgramRaster mCullBack; private ProgramRaster mCullFront; + private ProgramRaster mCullNone; private Allocation mTexTorus; private Allocation mTexOpaque; private Allocation mTexTransparent; + private Allocation mTexChecker; private Allocation mAllocPV; @@ -243,10 +248,12 @@ public class RsRenderStatesRS { mTexTorus = loadTextureRGB(R.drawable.torusmap); mTexOpaque = loadTextureRGB(R.drawable.data); mTexTransparent = loadTextureARGB(R.drawable.leaf); + mTexChecker = loadTextureRGB(R.drawable.checker); mScript.set_gTexTorus(mTexTorus); mScript.set_gTexOpaque(mTexOpaque); mScript.set_gTexTransparent(mTexTransparent); + mScript.set_gTexChecker(mTexChecker); } private void initFonts() { @@ -295,18 +302,32 @@ public class RsRenderStatesRS { mNearestClamp = Sampler.CLAMP_NEAREST(mRS); mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS); + bs = new Sampler.Builder(mRS); + bs.setMin(Sampler.Value.LINEAR_MIP_LINEAR); + bs.setMag(Sampler.Value.LINEAR); + bs.setWrapS(Sampler.Value.WRAP); + bs.setWrapT(Sampler.Value.WRAP); + bs.setAnisotropy(8.0f); + mMipLinearAniso8 = bs.create(); + bs.setAnisotropy(15.0f); + mMipLinearAniso15 = bs.create(); + mScript.set_gLinearClamp(mLinearClamp); mScript.set_gLinearWrap(mLinearWrap); mScript.set_gMipLinearWrap(mMipLinearWrap); + mScript.set_gMipLinearAniso8(mMipLinearAniso8); + mScript.set_gMipLinearAniso15(mMipLinearAniso15); mScript.set_gNearestClamp(mNearestClamp); } private void initProgramRaster() { mCullBack = ProgramRaster.CULL_BACK(mRS); mCullFront = ProgramRaster.CULL_FRONT(mRS); + mCullNone = ProgramRaster.CULL_NONE(mRS); mScript.set_gCullBack(mCullBack); mScript.set_gCullFront(mCullFront); + mScript.set_gCullNone(mCullNone); } private void initRS() { diff --git a/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs b/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs index 659e1e4..b471504 100644 --- a/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs +++ b/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs @@ -31,6 +31,7 @@ rs_program_store gProgStoreBlendAdd; rs_allocation gTexOpaque; rs_allocation gTexTorus; rs_allocation gTexTransparent; +rs_allocation gTexChecker; rs_mesh gMbyNMesh; rs_mesh gTorusMesh; @@ -47,10 +48,13 @@ int gDisplayMode; rs_sampler gLinearClamp; rs_sampler gLinearWrap; rs_sampler gMipLinearWrap; +rs_sampler gMipLinearAniso8; +rs_sampler gMipLinearAniso15; rs_sampler gNearestClamp; rs_program_raster gCullBack; rs_program_raster gCullFront; +rs_program_raster gCullNone; // Custom vertex shader compunents VertexShaderConstants *gVSConstants; @@ -64,11 +68,11 @@ rs_program_fragment gProgFragmentMultitex; #pragma rs export_var(gProgVertex, gProgFragmentColor, gProgFragmentTexture) #pragma rs export_var(gProgStoreBlendNoneDepth, gProgStoreBlendNone, gProgStoreBlendAlpha, gProgStoreBlendAdd) -#pragma rs export_var(gTexOpaque, gTexTorus, gTexTransparent) +#pragma rs export_var(gTexOpaque, gTexTorus, gTexTransparent, gTexChecker) #pragma rs export_var(gMbyNMesh, gTorusMesh) #pragma rs export_var(gFontSans, gFontSerif, gFontSerifBold, gFontSerifItalic, gFontSerifBoldItalic, gFontMono) -#pragma rs export_var(gLinearClamp, gLinearWrap, gMipLinearWrap, gNearestClamp) -#pragma rs export_var(gCullBack, gCullFront) +#pragma rs export_var(gLinearClamp, gLinearWrap, gMipLinearWrap, gMipLinearAniso8, gMipLinearAniso15, gNearestClamp) +#pragma rs export_var(gCullBack, gCullFront, gCullNone) #pragma rs export_var(gVSConstants, gFSConstants, gVSInputs, gProgVertexCustom, gProgFragmentCustom, gProgFragmentMultitex) //What we are showing @@ -110,7 +114,7 @@ void bindProgramVertexOrtho() { rsgBindProgramVertex(gProgVertex); // Setup the projectioni matrix rs_matrix4x4 proj; - rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -1,1); + rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -500, 500); rsgProgramVertexLoadProjectionMatrix(&proj); } @@ -276,14 +280,12 @@ void displayTextureSamplers() { startX + width, startY + height, 0, 1.5, 1.5, startX + width, startY, 0, 1.5, 0); - rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); rsgBindFont(gFontMono); rsgDrawText("Filtering: linear clamp", 10, 290); rsgDrawText("Filtering: linear wrap", 10, 590); rsgDrawText("Filtering: nearest clamp", 310, 290); rsgDrawText("Filtering: miplinear wrap", 310, 590); - } float gTorusRotation = 0; @@ -430,7 +432,7 @@ void displayMultitextureSample() { rsgBindSampler(gProgFragmentMultitex, 0, gLinearClamp); rsgBindSampler(gProgFragmentMultitex, 1, gLinearWrap); rsgBindSampler(gProgFragmentMultitex, 2, gLinearClamp); - rsgBindTexture(gProgFragmentMultitex, 0, gTexOpaque); + rsgBindTexture(gProgFragmentMultitex, 0, gTexChecker); rsgBindTexture(gProgFragmentMultitex, 1, gTexTorus); rsgBindTexture(gProgFragmentMultitex, 2, gTexTransparent); @@ -446,6 +448,69 @@ void displayMultitextureSample() { rsgDrawText("Custom shader with multitexturing", 10, 280); } +float gAnisoTime = 0.0f; +uint anisoMode = 0; +void displayAnisoSample() { + + gAnisoTime += gDt; + + rsgBindProgramVertex(gProgVertex); + float aspect = (float)rsgGetWidth() / (float)rsgGetHeight(); + rs_matrix4x4 proj; + rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f); + rsgProgramVertexLoadProjectionMatrix(&proj); + + rs_matrix4x4 matrix; + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNone); + rsgBindProgramFragment(gProgFragmentTexture); + rsMatrixLoadTranslate(&matrix, 0.0f, 0.0f, -10.0f); + rsMatrixRotate(&matrix, -80, 1.0f, 0.0f, 0.0f); + rsgProgramVertexLoadModelMatrix(&matrix); + + rsgBindProgramRaster(gCullNone); + + rsgBindTexture(gProgFragmentTexture, 0, gTexChecker); + + if(gAnisoTime >= 5.0f) { + gAnisoTime = 0.0f; + anisoMode ++; + anisoMode = anisoMode % 3; + } + + if(anisoMode == 0) { + rsgBindSampler(gProgFragmentTexture, 0, gMipLinearAniso8); + } + else if(anisoMode == 1) { + rsgBindSampler(gProgFragmentTexture, 0, gMipLinearAniso15); + } + else { + rsgBindSampler(gProgFragmentTexture, 0, gMipLinearWrap); + } + + float startX = -15; + float startY = -15; + float width = 30; + float height = 30; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 10, + startX + width, startY + height, 0, 10, 10, + startX + width, startY, 0, 10, 0); + + rsgBindProgramRaster(gCullBack); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + if(anisoMode == 0) { + rsgDrawText("Anisotropic filtering 8", 10, 40); + } + else if(anisoMode == 1) { + rsgDrawText("Anisotropic filtering 15", 10, 40); + } + else { + rsgDrawText("Miplinear filtering", 10, 40); + } +} int root(int launchID) { @@ -479,6 +544,9 @@ int root(int launchID) { case 7: displayMultitextureSample(); break; + case 8: + displayAnisoSample(); + break; } return 10; |