Skip to content

Commit

Permalink
Fix problem with some of the demos that have custom shaders that
Browse files Browse the repository at this point in the history
are using GLSL ES version 100.
  • Loading branch information
liaxim committed Apr 18, 2017
1 parent 652501d commit dd57734
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 18 deletions.
1 change: 1 addition & 0 deletions GVRf/Framework/framework/src/main/assets/_gvr.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
framebufferPixelsHigh="DEFAULT"
framebufferPixelsWide="DEFAULT"
showLoadingIcon="true"
useMultiview="false"
useProtectedFramebuffer="false"
useSrgbFramebuffer="false" >

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@

package org.gearvrf;

import android.content.res.AssetManager;
import android.content.res.Resources;

import org.gearvrf.utility.TextFile;
import org.gearvrf.utility.VrAppSettings;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
Expand All @@ -24,12 +30,6 @@
import java.util.HashMap;
import java.util.Map;

import org.gearvrf.utility.TextFile;
import org.gearvrf.utility.VrAppSettings;

import android.content.res.AssetManager;
import android.content.res.Resources;

/**
* Encapsulates the implementation shared between GVRMaterialShaderManager
* and GVRPostEffectShaderManager.
Expand All @@ -42,7 +42,8 @@ protected GVRBaseShaderManager(GVRContext gvrContext, long pointer) {
}

/**
* Adds a shader from sources in the assets directory.
* Adds a shader from sources in the assets directory. Assumes the shaders use GLSL ES version
* 100.
* @param pathPrefix
* Optional (may be {@code null}) prefix for shader filenames. If
* present, will be prepended to {@code vertexShader} and
Expand All @@ -61,36 +62,72 @@ protected GVRBaseShaderManager(GVRContext gvrContext, long pointer) {
@Override
public GVRShaderId addShader(String pathPrefix, String vertexShader_asset,
String fragmentShader_asset) {
return addShader(pathPrefix, vertexShader_asset, fragmentShader_asset, GLSLESVersion.V100);
}

/**
* Adds a shader from sources in the assets directory.
* @param pathPrefix
* Optional (may be {@code null}) prefix for shader filenames. If
* present, will be prepended to {@code vertexShader} and
* {@code fragmentShader}, thus allowing you to build a tree of
* shaders in your assets directory, where each node contains
* vertex and fragment shaders with the same filename. If
* {@code null}, {@code vertexShader} and {@code fragmentShader}
* are the path names of files in the assets directory.
* @param vertexShader_asset
* Filename of a vertex shader, relative to the assets directory
* @param fragmentShader_asset
* Filename of a fragment shader, relative to the assets
* directory
* @param glslesVersion GLSL ES version used by the shaders
* @return ID of new shader added
*/
public GVRShaderId addShader(String pathPrefix, String vertexShader_asset,
String fragmentShader_asset, GLSLESVersion glslesVersion) {
Resources resources = getResources();
try {
InputStream vertexShader = open(resources, pathPrefix,
vertexShader_asset);
InputStream fragmentShader = open(resources, pathPrefix,
fragmentShader_asset);
return newShader(vertexShader, fragmentShader);
return newShader(vertexShader, fragmentShader, glslesVersion);
} catch (IOException e) {
e.printStackTrace(); // give user a clue
return null;
}
}

/**
* Adds a shader from sources in res/raw.
* Adds a shader from sources in res/raw. Assumes the shaders use GLSL ES version 100.
* @param vertexShader_resRaw
* R.raw id, for a file containing a vertex shader
* @param fragmentShader_resRaw
* R.raw id, for a file containing a fragment shader
*/
@Override
public GVRShaderId newShader(int vertexShader_resRaw, int fragmentShader_resRaw) {
return newShader(vertexShader_resRaw, fragmentShader_resRaw, GLSLESVersion.V100);
}

/**
* Adds a shader from sources in res/raw.
* @param vertexShader_resRaw
* R.raw id, for a file containing a vertex shader
* @param fragmentShader_resRaw
* R.raw id, for a file containing a fragment shader
* @param glslesVersion GLSL ES version used by the shaders
*/
public GVRShaderId newShader(int vertexShader_resRaw, int fragmentShader_resRaw, GLSLESVersion glslesVersion) {
Resources resources = getResources();
InputStream vertexShader = open(resources, vertexShader_resRaw);
InputStream fragmentShader = open(resources, fragmentShader_resRaw);
return newShader(vertexShader, fragmentShader);
return newShader(vertexShader, fragmentShader, glslesVersion);
}

/**
* Adds a shader from sources in separate input streams.
* Adds a shader from sources in separate input streams. Assumes the shaders use GLSL ES version
* 100.
* @param vertexShader_stream
* GLSL source code for a vertex shader. Stream will be closed
* when method returns.
Expand All @@ -101,20 +138,42 @@ public GVRShaderId newShader(int vertexShader_resRaw, int fragmentShader_resRaw)
@Override
public GVRShaderId newShader(InputStream vertexShader_stream,
InputStream fragmentShader_stream) {
return newShader(vertexShader_stream, fragmentShader_stream, GLSLESVersion.V100);
}

/**
* Adds a shader from sources in separate input streams.
* @param vertexShader_stream
* GLSL source code for a vertex shader. Stream will be closed
* when method returns.
* @param fragmentShader_stream
* GLSL source code for a fragment shader. Stream will be closed
* when method returns.
* @param glslesVersion GLSL ES version used by the shaders
*/
public GVRShaderId newShader(InputStream vertexShader_stream,
InputStream fragmentShader_stream, GLSLESVersion glslesVersion) {
String vertexShader = TextFile.readTextFile(vertexShader_stream);
String fragmentShader = TextFile.readTextFile(fragmentShader_stream);
final VrAppSettings settings = getGVRContext().getActivity().getAppSettings();
String defines="#version 300 es\n";
if (settings.isMultiviewSet())
{
defines = defines + "#define HAS_MULTIVIEW\n";

String defines;
if (GLSLESVersion.V300 == glslesVersion) {
defines = "#version " + glslesVersion.toInt() + " es\n";
if (settings.isMultiviewSet())
{
defines = defines + "#define HAS_MULTIVIEW\n";
}
} else {
defines = "";
}

vertexShader = defines + vertexShader;
fragmentShader = defines + fragmentShader;

return newShader(vertexShader, fragmentShader);
}


/**
* Retrieves the shader template of the specified class.
*
Expand Down Expand Up @@ -205,4 +264,17 @@ protected static InputStream open(Resources resources, int resRawId) {
protected Map<Class<? extends GVRShaderTemplate>, GVRShaderTemplate>
mShaderTemplates = new HashMap<Class<? extends GVRShaderTemplate>, GVRShaderTemplate>();

public enum GLSLESVersion {
V100(100),
V300(300);

private GLSLESVersion(int v) {
this.v = v;
}
private final int v;

private int toInt() {
return v;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public GVRShaderId newShader(String vertexShader, String fragmentShader)

/**
* Builds a shader program from the supplied vertex and fragment shader
* code from resources in res/raw.
* code from resources in res/raw. Assumes the shaders are using GLSL ES version 100.
*
* @param vertexShader_resRaw
* R.raw id, for a file containing a vertex shader
Expand All @@ -90,6 +90,22 @@ public GVRCustomPostEffectShaderId addShader(int vertexShader_resRaw, int fragme
return (GVRCustomPostEffectShaderId) newShader(vertexShader_resRaw, fragmentShader_resRaw);
}

/**
* Builds a shader program from the supplied vertex and fragment shader
* code from resources in res/raw.
*
* @param vertexShader_resRaw
* R.raw id, for a file containing a vertex shader
* @param fragmentShader_resRaw
* R.raw id, for a file containing a fragment shader
* @param glslesVersion GLSL ES version the shaders are using
* @return An opaque type that you can pass to {@link #getShaderMap(GVRCustomPostEffectShaderId)}
* or to the {@link GVRPostEffect} constructor and {@code setShader} methods.
*/
public GVRCustomPostEffectShaderId addShader(int vertexShader_resRaw, int fragmentShader_resRaw, GLSLESVersion glslesVersion) {
return (GVRCustomPostEffectShaderId) newShader(vertexShader_resRaw, fragmentShader_resRaw, glslesVersion);
}

@Override
public GVRShaderMaps getShaderMapping(GVRShaderId id) {
return posteffects.get(id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

import org.gearvrf.GVRBaseShaderManager;
import org.gearvrf.GVRBitmapTexture;
import org.gearvrf.GVRCamera;
import org.gearvrf.GVRCameraRig;
Expand Down Expand Up @@ -393,7 +394,7 @@ private static synchronized GVRPostEffectShaderId getShaderId(
GVRPostEffectShaderManager shaderManager = gvrContext
.getPostEffectShaderManager();
shaderId = shaderManager.addShader(R.raw.posteffect_quad,
R.raw.hud_console);
R.raw.hud_console, GVRBaseShaderManager.GLSLESVersion.V300);

shaderMap = shaderManager.getShaderMap(shaderId);
shaderMap.addTextureKey("u_overlay", MAIN_TEXTURE);
Expand Down

0 comments on commit dd57734

Please sign in to comment.