Project

General

Profile

« Previous | Next » 

Revision 94f6d472

Added by Leszek Koltunski over 7 years ago

Make it more flexible; now it can run almost all apps on OpenGL 2.0 contexts; OpenGL 3.0 ( with GLSL 3.00) required for POSTPROCESSING.

View differences:

src/main/java/org/distorted/library/Distorted.java
29 29
 */
30 30
public class Distorted 
31 31
  {
32
  static final String glslVersion="#version 300 es\n";
32
  static int GLSL;
33
  static String GLSL_VERSION;
34

  
33 35
  /**
34 36
   * When creating an instance of a DistortedTexture from another instance, clone the Bitmap that's
35 37
   * backing up our DistortedTexture.
......
104 106
  public static void onCreate(final Context context)
105 107
  throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException
106 108
    {
109
    GLSL = 100;
110
    GLSL_VERSION= (GLSL==100 ? "#version 100\n" : "#version 300 es\n");
111

  
107 112
    final Resources resources = context.getResources();
108 113
    DistortedEffects.createProgram(resources);
109 114
    EffectQueuePostprocess.createProgram(resources);
src/main/java/org/distorted/library/DistortedEffects.java
110 110
    final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader);
111 111
    final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader);
112 112

  
113
    String mainVertHeader= Distorted.glslVersion;
114
    String mainFragHeader= Distorted.glslVersion;
113
    String mainVertHeader= Distorted.GLSL_VERSION;
114
    String mainFragHeader= Distorted.GLSL_VERSION;
115 115

  
116 116
    EffectNames name;
117 117
    EffectTypes type;
......
144 144
    //android.util.Log.e("Effects", "vertHeader= "+mainVertHeader);
145 145
    //android.util.Log.e("Effects", "fragHeader= "+mainFragHeader);
146 146

  
147
    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader);
147
    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL);
148 148

  
149 149
    int mainProgramH = mMainProgram.getProgramHandle();
150 150
    EffectQueueFragment.getUniforms(mainProgramH);
......
156 156
    final InputStream blitVertStream = resources.openRawResource(R.raw.blit_vertex_shader);
157 157
    final InputStream blitFragStream = resources.openRawResource(R.raw.blit_fragment_shader);
158 158

  
159
    String blitVertHeader= (Distorted.glslVersion + "#define NUM_VERTEX 0\n"  );
160
    String blitFragHeader= (Distorted.glslVersion + "#define NUM_FRAGMENT 0\n");
159
    String blitVertHeader= (Distorted.GLSL_VERSION + "#define NUM_VERTEX 0\n"  );
160
    String blitFragHeader= (Distorted.GLSL_VERSION + "#define NUM_FRAGMENT 0\n");
161 161

  
162 162
    try
163 163
      {
164
      mBlitProgram = new DistortedProgram(blitVertStream,blitFragStream,blitVertHeader,blitFragHeader);
164
      mBlitProgram = new DistortedProgram(blitVertStream,blitFragStream,blitVertHeader,blitFragHeader, Distorted.GLSL);
165 165
      }
166 166
    catch(Exception e)
167 167
      {
......
179 179

  
180 180
    try
181 181
      {
182
      mDebugProgram = new DistortedProgram(debugVertexStream,debugFragmentStream, Distorted.glslVersion, Distorted.glslVersion);
182
      mDebugProgram = new DistortedProgram(debugVertexStream,debugFragmentStream, Distorted.GLSL_VERSION, Distorted.GLSL_VERSION, Distorted.GLSL);
183 183
      }
184 184
    catch(Exception e)
185 185
      {
src/main/java/org/distorted/library/EffectQueuePostprocess.java
123 123
    try
124 124
      {
125 125
      mBlur1Program = new DistortedProgram(blur1VertexStream,blur1FragmentStream,
126
                                          Distorted.glslVersion,
127
                                          Distorted.glslVersion+"#define MAX_BLUR "+MAX_BLUR);
126
                                          Distorted.GLSL_VERSION,
127
                                          Distorted.GLSL_VERSION + "#define MAX_BLUR "+MAX_BLUR, Distorted.GLSL);
128 128
      }
129 129
    catch(Exception e)
130 130
      {
......
145 145
    try
146 146
      {
147 147
      mBlur2Program = new DistortedProgram(blur2VertexStream,blur2FragmentStream,
148
                                          Distorted.glslVersion,
149
                                          Distorted.glslVersion + "#define MAX_BLUR "+MAX_BLUR);
148
                                          Distorted.GLSL_VERSION,
149
                                          Distorted.GLSL_VERSION + "#define MAX_BLUR "+MAX_BLUR, Distorted.GLSL);
150 150
      }
151 151
    catch(Exception e)
152 152
      {
153 153
      android.util.Log.e("EFFECTS", "exception trying to compile BLUR2 program: "+e.getMessage());
154
      throw new RuntimeException(e.getMessage());
154
      // run anyway as compiling Blur2 WILL fail on OpenGL 2.0 contexts
155
      mBlur2Program = mBlur1Program;
155 156
      }
156 157

  
157 158
    int blur2ProgramH = mBlur2Program.getProgramHandle();
src/main/java/org/distorted/library/program/DistortedProgram.java
35 35
 */
36 36
public class DistortedProgram
37 37
  {
38
  private int mProgramHandle;
38
  private String mAttributeStr;
39
  private int mAttributeLen;
39 40

  
41
  private int mProgramHandle;
40 42
  private int mNumAttributes;
41 43
  private String[] mAttributeName;
42 44

  
......
105 107
      if( currChar==';') break;
106 108
      }
107 109

  
108
    if( semicolon<len && semicolon-whiteSpace>=4 )   // "in a;" --> 4
110
    if( semicolon<len && semicolon-whiteSpace>=mAttributeLen+1 )
109 111
      {
110 112
      String subline = line.substring(whiteSpace,semicolon);
111 113
      int subLen = semicolon-whiteSpace;
112 114

  
113
      if( subline.startsWith("in "))
115
      if( subline.startsWith(mAttributeStr))
114 116
        {
115 117
        //android.util.Log.e("program", "GOOD LINE: " +subline+" subLen="+subLen);
116 118

  
117
        for(nameBegin=subLen-1; nameBegin>1; nameBegin--)
119
        for(nameBegin=subLen-1; nameBegin>mAttributeLen-2; nameBegin--)
118 120
          {
119 121
          currChar=subline.charAt(nameBegin);
120 122

  
......
260 262
   * @throws LinkingException
261 263
   */
262 264

  
263
  public DistortedProgram(final InputStream vertex, final InputStream fragment, final String vertexHeader, final String fragmentHeader)
265
  public DistortedProgram(final InputStream vertex, final InputStream fragment, final String vertexHeader, final String fragmentHeader, int glslVersion)
264 266
  throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException
265 267
    {
268
    mAttributeStr = (glslVersion == 100 ? "attribute " : "in ");
269
    mAttributeLen = mAttributeStr.length();
270

  
266 271
    mNumAttributes = 0;
267 272

  
268 273
    final String vertexShader   = readTextFileFromRawResource(vertex  , true );
src/main/res/raw/blit_fragment_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
in vec2 v_TexCoordinate;      // Interpolated texture coordinate per fragment.
22
#if __VERSION__ != 100
23
#define TEXTURE texture
23 24
out vec4 fragColor;           // The output color
25
in vec2 v_TexCoordinate;      // Interpolated texture coordinate per fragment.
26
#else
27
#define TEXTURE texture2D
28
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment.
29
#endif
30

  
24 31
uniform sampler2D u_Texture;  // The input texture.
25 32

  
26 33
//////////////////////////////////////////////////////////////////////////////////////////////
27 34

  
28 35
void main()                    		
29
  {  
30
  fragColor = texture(u_Texture,v_TexCoordinate);
36
  {
37
#if __VERSION__ != 100
38
  fragColor    =
39
#else
40
  gl_FragColor =
41
#endif
42

  
43
  TEXTURE(u_Texture,v_TexCoordinate);
31 44
  }
src/main/res/raw/blit_vertex_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
uniform float u_Depth;    // distance from the near plane to render plane, in clip coords
23
in vec2 a_Position;       // Per-vertex position.
24
out vec2 v_TexCoordinate; //
22
#if __VERSION__ != 100
23
in vec2 a_Position;           // Per-vertex position.
24
out vec2 v_TexCoordinate;     //
25
#else
26
attribute vec2 a_Position;    // Per-vertex position.
27
varying vec2 v_TexCoordinate; //
28
#endif
29

  
30
uniform float u_Depth;        // distance from the near plane to render plane, in clip coords
25 31

  
26 32
//////////////////////////////////////////////////////////////////////////////////////////////
27 33

  
src/main/res/raw/blur1_fragment_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
#if __VERSION__ != 100
23
#define TEXTURE texture
22 24
in vec2 v_TexCoordinate;
23 25
out vec4 fragColor;
26
#else
27
#define TEXTURE texture2D
28
varying vec2 v_TexCoordinate;
29
#endif
30

  
24 31
uniform sampler2D u_ColorTexture;
25 32
uniform float u_Offsets[MAX_BLUR];
26 33
uniform float u_Weights[MAX_BLUR];
......
30 37

  
31 38
void main()
32 39
  {
33
  vec4 pixel= texture(u_ColorTexture,v_TexCoordinate) * u_Weights[0];
40
  vec4 pixel= TEXTURE(u_ColorTexture,v_TexCoordinate) * u_Weights[0];
34 41

  
35 42
  for (int i=1; i<=u_Radius; i+=1)
36 43
    {
37
    pixel += ( texture(u_ColorTexture,vec2(v_TexCoordinate.x+u_Offsets[i],v_TexCoordinate.y)) +
38
               texture(u_ColorTexture,vec2(v_TexCoordinate.x-u_Offsets[i],v_TexCoordinate.y)) ) * u_Weights[i];
44
    pixel += ( TEXTURE(u_ColorTexture,vec2(v_TexCoordinate.x+u_Offsets[i],v_TexCoordinate.y)) +
45
               TEXTURE(u_ColorTexture,vec2(v_TexCoordinate.x-u_Offsets[i],v_TexCoordinate.y)) ) * u_Weights[i];
39 46
    }
40 47

  
41
  fragColor = pixel;
48
#if __VERSION__ != 100
49
  fragColor    =
50
#else
51
  gl_FragColor =
52
#endif
53

  
54
  pixel;
42 55
  }
src/main/res/raw/blur2_fragment_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
#if __VERSION__ != 100
23
#define TEXTURE texture
22 24
in vec2 v_TexCoordinate;
23 25
out vec4 fragColor;
26
#else
27
#define TEXTURE texture2D
28
varying vec2 v_TexCoordinate;
29
#endif
30

  
24 31
uniform sampler2D u_ColorTexture;
25 32
uniform sampler2D u_DepthTexture;
26 33
uniform float u_Offsets[MAX_BLUR];
......
31 38

  
32 39
void main()
33 40
  {
34
  gl_FragDepth = 0.0;//texture(u_DepthTexture,v_TexCoordinate);
41
  gl_FragDepth = TEXTURE(u_DepthTexture,v_TexCoordinate).r;
35 42

  
36
  vec4 pixel= texture(u_ColorTexture,v_TexCoordinate) * u_Weights[0];
43
  vec4 pixel= TEXTURE(u_ColorTexture,v_TexCoordinate) * u_Weights[0];
37 44

  
38 45
  for (int i=1; i<=u_Radius; i+=1)
39 46
    {
40
    pixel += ( texture(u_ColorTexture,vec2(v_TexCoordinate.x+u_Offsets[i],v_TexCoordinate.y)) +
41
               texture(u_ColorTexture,vec2(v_TexCoordinate.x-u_Offsets[i],v_TexCoordinate.y)) ) * u_Weights[i];
47
    pixel += ( TEXTURE(u_ColorTexture,vec2(v_TexCoordinate.x+u_Offsets[i],v_TexCoordinate.y)) +
48
               TEXTURE(u_ColorTexture,vec2(v_TexCoordinate.x-u_Offsets[i],v_TexCoordinate.y)) ) * u_Weights[i];
42 49
    }
43 50

  
44
  fragColor = pixel;
51
#if __VERSION__ != 100
52
  fragColor    =
53
#else
54
  gl_FragColor =
55
#endif
56

  
57
  pixel;
45 58
  }
src/main/res/raw/blur_vertex_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
uniform float u_Depth;    // distance from the near plane to render plane, in clip coords
22
#if __VERSION__ != 100
23 23
in vec2 a_Position;       // Per-vertex position.
24 24
in vec2 a_TexCoordinate;  // Per-vertex texture coordinate information we will pass in.
25 25
out vec2 v_TexCoordinate; //
26
#else
27
attribute vec2 a_Position;       // Per-vertex position.
28
attribute vec2 a_TexCoordinate;  // Per-vertex texture coordinate information we will pass in.
29
varying vec2 v_TexCoordinate;    //
30
#endif
31

  
32
uniform float u_Depth;    // distance from the near plane to render plane, in clip coords
26 33

  
27 34
//////////////////////////////////////////////////////////////////////////////////////////////
28 35

  
src/main/res/raw/main_fragment_shader.glsl
18 18
//////////////////////////////////////////////////////////////////////////////////////////////
19 19

  
20 20
precision lowp float;
21
  
22
uniform sampler2D u_Texture;            // The input texture.
23
    
21

  
22
#if __VERSION__ != 100
23
#define TEXTURE texture
24 24
in vec3 v_Position;                     // Interpolated position for this fragment.
25 25
in vec3 v_Normal;                       // Interpolated normal for this fragment.
26 26
in vec2 v_TexCoordinate;                // Interpolated texture coordinate per fragment.
27 27
out vec4 fragColor;                     // The output color
28
#else
29
#define TEXTURE texture2D
30
varying vec3 v_Position;                // Interpolated position for this fragment.
31
varying vec3 v_Normal;                  // Interpolated normal for this fragment.
32
varying vec2 v_TexCoordinate;           // Interpolated texture coordinate per fragment.
33
#endif
34

  
35
uniform sampler2D u_Texture;            // The input texture.
28 36

  
29 37
#if NUM_FRAGMENT>0
30 38
uniform int fNumEffects;                // total number of fragment effects
......
93 101

  
94 102
void main()                    		
95 103
  {  
96
  vec4 pixel = texture(u_Texture,v_TexCoordinate);
104
  vec4 pixel = TEXTURE(u_Texture,v_TexCoordinate);
97 105

  
98 106
#if NUM_FRAGMENT>0
99 107
  vec2 diff;
......
141 149
    }
142 150
#endif
143 151

  
144
  fragColor = vec4(pixel.rgb * (1.0 + 7.0*v_Normal.z) * 0.125, pixel.a);
152
#if __VERSION__ != 100
153
  fragColor    =
154
#else
155
  gl_FragColor =
156
#endif
157

  
158
  vec4(pixel.rgb * (1.0 + 7.0*v_Normal.z) * 0.125, pixel.a);
145 159
  }
src/main/res/raw/main_vertex_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
#if __VERSION__ != 100
23
in vec3 a_Position;                  // Per-vertex position.
24
in vec3 a_Normal;                    // Per-vertex normal vector.
25
in vec2 a_TexCoordinate;             // Per-vertex texture coordinate.
26
out vec3 v_Position;                 //
27
out vec3 v_Normal;                   //
28
out vec2 v_TexCoordinate;            //
29
#else
30
attribute vec3 a_Position;           // Per-vertex position.
31
attribute vec3 a_Normal;             // Per-vertex normal vector.
32
attribute vec2 a_TexCoordinate;      // Per-vertex texture coordinate.
33
varying vec3 v_Position;             //
34
varying vec3 v_Normal;               //
35
varying vec2 v_TexCoordinate;        //
36
#endif
37

  
22 38
uniform vec3 u_objD;                 // half of object width x half of object height X half the depth;
23 39
                                     // point (0,0,0) is the center of the object
24 40

  
......
26 42
                                     // I read OpenGL ES has a built-in uniform variable gl_DepthRange.near = n,
27 43
                                     // .far = f, .diff = f-n so maybe u_Depth is redundant
28 44
                                     // Update: this struct is only available in fragment shaders
29
                                
45

  
30 46
uniform mat4 u_MVPMatrix;            // the combined model/view/projection matrix.
31 47
uniform mat4 u_MVMatrix;             // the combined model/view matrix.
32
		 
33
in vec3 a_Position;                  // Per-vertex position.
34
in vec3 a_Normal;                    // Per-vertex normal vector.
35
in vec2 a_TexCoordinate;             // Per-vertex texture coordinate.
36
		  
37
out vec3 v_Position;                 //
38
out vec3 v_Normal;                   //
39
out vec2 v_TexCoordinate;            //
40 48

  
41 49
#if NUM_VERTEX>0
42 50
uniform int vNumEffects;             // total number of vertex effects
src/main/res/raw/test_fragment_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
#if __VERSION__ != 100
22 23
out vec4 fragColor;
24
#endif
23 25

  
24 26
//////////////////////////////////////////////////////////////////////////////////////////////
25 27

  
26 28
void main()
27 29
  {
28
  fragColor = vec4(1.0,0.0,0.0,0.2);
30
#if __VERSION__ != 100
31
  fragColor    =
32
#else
33
  gl_FragColor =
34
#endif
35

  
36
  vec4(1.0,0.0,0.0,0.2);
29 37
  }
src/main/res/raw/test_vertex_shader.glsl
19 19

  
20 20
precision lowp float;
21 21

  
22
#if __VERSION__ != 100
23
in vec2 a_Position;        // Per-vertex position information we will pass in.
24
#else
25
attribute vec2 a_Position; // Per-vertex position information we will pass in.
26
#endif
27

  
22 28
uniform vec2 u_objD;       // object width X object height.
23 29
uniform mat4 u_MVPMatrix;  // the combined model/view/projection matrix.
24
in vec2 a_Position;        // Per-vertex position information we will pass in.
25 30

  
26 31
//////////////////////////////////////////////////////////////////////////////////////////////
27 32

  

Also available in: Unified diff