Merge pull request #224 from zzuegg/master

Tessellation shader fix
experimental
Rémy Bouquet 10 years ago
commit 5b1e3e185b
  1. 4
      jme3-core/src/main/java/com/jme3/renderer/opengl/GL4.java
  2. 26
      jme3-testdata/src/main/resources/Materials/Tess/SimpleTess.tsctrl
  3. 26
      jme3-testdata/src/main/resources/Materials/Tess/SimpleTess.tseval

@ -39,8 +39,8 @@ import java.nio.IntBuffer;
* @author Kirill Vainer
*/
public interface GL4 extends GL3 {
public static final int GL_TESS_CONTROL_SHADER=0x8E87;
public static final int GL_TESS_EVALUATION_SHADER=0x8E88;
public static final int GL_TESS_CONTROL_SHADER=0x8E88;
public static final int GL_TESS_EVALUATION_SHADER=0x8E87;
public static final int GL_PATCHES=0xE;
public void glPatchParameter(int count);
}

@ -1,13 +1,17 @@
layout (quads,equal_spacing,cw) in;
uniform mat4 g_WorldViewProjectionMatrix;
layout(vertices=4) out;
out gl_PerVertex{
vec4 gl_Position;
}gl_out[];
uniform int m_TessellationFactor;
void main(){
vec3 p0 = mix(gl_in[0].gl_Position.xyz, gl_in[3].gl_Position.xyz, gl_TessCoord.x);
// interpolate in horizontal direction between vert. 1 and 2
vec3 p1 = mix(gl_in[1].gl_Position.xyz, gl_in[2].gl_Position.xyz, gl_TessCoord.x);
// interpolate in vert direction
vec3 tePosition = mix(p0, p1, gl_TessCoord.y);
gl_Position = g_WorldViewProjectionMatrix * vec4(tePosition, 1);
}
if (gl_InvocationID == 0){
gl_TessLevelOuter[0]=m_TessellationFactor;
gl_TessLevelOuter[1]=m_TessellationFactor;
gl_TessLevelOuter[2]=m_TessellationFactor;
gl_TessLevelOuter[3]=m_TessellationFactor;
gl_TessLevelInner[0]=m_TessellationFactor;
gl_TessLevelInner[1]=m_TessellationFactor;
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

@ -1,17 +1,13 @@
layout(vertices=4) out;
out gl_PerVertex{
vec4 gl_Position;
}gl_out[];
uniform int m_TessellationFactor;
void main(){
if (gl_InvocationID == 0){
gl_TessLevelOuter[0]=m_TessellationFactor;
gl_TessLevelOuter[1]=m_TessellationFactor;
gl_TessLevelOuter[2]=m_TessellationFactor;
gl_TessLevelOuter[3]=m_TessellationFactor;
layout (quads,equal_spacing,cw) in;
gl_TessLevelInner[0]=m_TessellationFactor;
gl_TessLevelInner[1]=m_TessellationFactor;
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
uniform mat4 g_WorldViewProjectionMatrix;
void main(){
vec3 p0 = mix(gl_in[0].gl_Position.xyz, gl_in[3].gl_Position.xyz, gl_TessCoord.x);
// interpolate in horizontal direction between vert. 1 and 2
vec3 p1 = mix(gl_in[1].gl_Position.xyz, gl_in[2].gl_Position.xyz, gl_TessCoord.x);
// interpolate in vert direction
vec3 tePosition = mix(p0, p1, gl_TessCoord.y);
gl_Position = g_WorldViewProjectionMatrix * vec4(tePosition, 1);
}

Loading…
Cancel
Save