List of usage examples for com.badlogic.gdx.graphics.glutils ShaderProgram NORMAL_ATTRIBUTE
String NORMAL_ATTRIBUTE
To view the source code for com.badlogic.gdx.graphics.glutils ShaderProgram NORMAL_ATTRIBUTE.
Click Source Link
From source file:com.deepwallgames.quantumhue.ImmediateModeShader30.java
License:Apache License
static private String createVertexShader(boolean hasNormals, boolean hasColors, int numTexCoords) { String prefix = "#version 100\n"; String shader = prefix + "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" + (hasNormals ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + ";\n" : "") + (hasColors ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : ""); for (int i = 0; i < numTexCoords; i++) { shader += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n"; }/*from ww w . j a v a 2 s. co m*/ shader += "uniform mat4 u_projModelView;\n"; shader += (hasColors ? "varying vec4 v_col;\n" : ""); for (int i = 0; i < numTexCoords; i++) { shader += "varying vec2 v_tex" + i + ";\n"; } shader += "void main() {\n" + " gl_Position = u_projModelView * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" + (hasColors ? " v_col = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : ""); for (int i = 0; i < numTexCoords; i++) { shader += " v_tex" + i + " = " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n"; } shader += " gl_PointSize = 1.0;\n"; shader += "}\n"; return shader; }
From source file:com.gemserk.commons.gdx.graphics.Gdx2dMeshBuilder.java
License:Apache License
private VertexAttribute[] buildVertexAttributes(boolean hasNormals, boolean hasColor, int numTexCoords) { Array<VertexAttribute> attribs = new Array<VertexAttribute>(); attribs.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE)); if (hasNormals) attribs.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE)); if (hasColor) attribs.add(new VertexAttribute(Usage.ColorPacked, 4, ShaderProgram.COLOR_ATTRIBUTE)); for (int i = 0; i < numTexCoords; i++) { attribs.add(new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + i)); }/* w w w . j a v a 2 s .c om*/ VertexAttribute[] array = new VertexAttribute[attribs.size]; for (int i = 0; i < attribs.size; i++) array[i] = attribs.get(i); return array; }
From source file:com.iLoong.launcher.min3d.ObjLoader.java
License:Open Source License
/** * Loads a mesh from the given string in Wavefront OBJ format * /*from www .ja v a2 s .com*/ * @param obj * The string * @param flipV * whether to flip the v texture coordinate or not * @param useIndices * whether to create an array of indices or not * @return The Mesh */ public static Mesh loadObjFromString(String obj, boolean flipV, boolean useIndices, float offsetX, float offsetY, float offsetZ, float scaleX, float scaleY, float scaleZ) { String[] lines = obj.split("\n"); float[] vertices = new float[lines.length * 3]; float[] normals = new float[lines.length * 3]; float[] uv = new float[lines.length * 3]; int numVertices = 0; int numNormals = 0; int numUV = 0; int numFaces = 0; int[] facesVerts = new int[lines.length * 3]; int[] facesNormals = new int[lines.length * 3]; int[] facesUV = new int[lines.length * 3]; int vertexIndex = 0; int normalIndex = 0; int uvIndex = 0; int faceIndex = 0; Color default_color = new Color(1.0f, 1.0f, 1.0f, 1.0f); for (int i = 0; i < lines.length; i++) { String line = lines[i]; if (line.startsWith("v ")) { String[] tokens = line.split("[ ]+"); float vertex_x = Float.parseFloat(tokens[1]); float vertex_y = Float.parseFloat(tokens[2]); float vertex_z = Float.parseFloat(tokens[3]); if (scaleX != 1f) { vertex_x = vertex_x * scaleX; } if (scaleY != 1f) { vertex_y = vertex_y * scaleY; } if (scaleZ != 1f) { vertex_z = vertex_z * scaleZ; } vertices[vertexIndex] = vertex_x + offsetX; vertices[vertexIndex + 1] = vertex_y + offsetY; vertices[vertexIndex + 2] = vertex_z + offsetZ; vertexIndex += 3; numVertices++; continue; } if (line.startsWith("vn ")) { String[] tokens = line.split("[ ]+"); normals[normalIndex] = Float.parseFloat(tokens[1]); normals[normalIndex + 1] = Float.parseFloat(tokens[2]); normals[normalIndex + 2] = Float.parseFloat(tokens[3]); normalIndex += 3; numNormals++; continue; } if (line.startsWith("vt")) { String[] tokens = line.split("[ ]+"); uv[uvIndex] = Float.parseFloat(tokens[1]); uv[uvIndex + 1] = flipV ? 1 - Float.parseFloat(tokens[2]) : Float.parseFloat(tokens[2]); uvIndex += 2; numUV++; continue; } if (line.startsWith("f ")) { String[] tokens = line.split("[ ]+"); if (tokens.length == 5) { String[] parts = tokens[1].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; parts = tokens[2].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; parts = tokens[4].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; numFaces++; parts = tokens[2].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; parts = tokens[3].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; parts = tokens[4].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; numFaces++; } else { String[] parts = tokens[1].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; parts = tokens[2].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; parts = tokens[3].split("/"); facesVerts[faceIndex] = getIndex(parts[0], numVertices); if (parts.length > 2) facesNormals[faceIndex] = getIndex(parts[2], numNormals); if (parts.length > 1) facesUV[faceIndex] = getIndex(parts[1], numUV); faceIndex++; numFaces++; } continue; } } Mesh mesh = null; ArrayList<VertexAttribute> attributes = new ArrayList<VertexAttribute>(); attributes.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE)); attributes.add(new VertexAttribute(Usage.ColorPacked, 4, ShaderProgram.COLOR_ATTRIBUTE)); if (numNormals > 0) attributes.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE)); if (numUV > 0) attributes .add(new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + "0")); if (useIndices) { int attrCount = 4 + (numNormals > 0 ? 3 : 0) + (numUV > 0 ? 2 : 0); int normOffset = 4; int uvOffset = 4 + (numNormals > 0 ? 3 : 0); float verts[] = new float[numVertices * attrCount]; for (int i = 0; i < numVertices; i++) { verts[i * attrCount] = vertices[i * 3]; verts[i * attrCount + 1] = vertices[i * 3 + 1]; verts[i * attrCount + 2] = vertices[i * 3 + 2]; verts[i * attrCount + 3] = default_color.toFloatBits(); } for (int i = 0; i < numFaces * 3; i++) { int vertexIdx = facesVerts[i]; if (numNormals > 0) { int normalIdx = facesNormals[i] * 3; verts[vertexIdx * attrCount + normOffset] = normals[normalIdx]; verts[vertexIdx * attrCount + normOffset + 1] = normals[normalIdx + 1]; verts[vertexIdx * attrCount + normOffset + 2] = normals[normalIdx + 2]; } if (numUV > 0) { int uvIdx = facesUV[i] * 2; verts[vertexIdx * attrCount + uvOffset] = uv[uvIdx]; verts[vertexIdx * attrCount + uvOffset + 1] = uv[uvIdx + 1]; } } short[] indices = new short[numFaces * 3]; for (int i = 0; i < indices.length; i++) indices[i] = (short) facesVerts[i]; mesh = new Mesh(null, true, verts.length, indices.length, attributes.toArray(new VertexAttribute[attributes.size()])); mesh.setVertices(verts); mesh.setIndices(indices); } else { float[] verts = new float[(numFaces * 3) * (4 + (numNormals > 0 ? 3 : 0) + (numUV > 0 ? 2 : 0))]; for (int i = 0, vi = 0; i < numFaces * 3; i++) { int vertexIdx = facesVerts[i] * 3; verts[vi++] = vertices[vertexIdx]; verts[vi++] = vertices[vertexIdx + 1]; verts[vi++] = vertices[vertexIdx + 2]; verts[vi++] = default_color.toFloatBits(); if (numNormals > 0) { int normalIdx = facesNormals[i] * 3; verts[vi++] = normals[normalIdx]; verts[vi++] = normals[normalIdx + 1]; verts[vi++] = normals[normalIdx + 2]; } if (numUV > 0) { int uvIdx = facesUV[i] * 2; verts[vi++] = uv[uvIdx]; verts[vi++] = uv[uvIdx + 1]; } } mesh = new Mesh(null, true, numFaces * 3, 0, attributes.toArray(new VertexAttribute[attributes.size()])); mesh.setVertices(verts); } return mesh; }
From source file:com.kevlanche.threedeetest.ScalableObjLoader.java
License:Apache License
protected ModelData loadModelData(FileHandle file, boolean flipV) { String line;/* w w w. ja va 2 s.c o m*/ String[] tokens; char firstChar; MtlLoader mtl = new MtlLoader(); // Create a "default" Group and set it as the active group, in case // there are no groups or objects defined in the OBJ file. Group activeGroup = new Group("default"); groups.add(activeGroup); BufferedReader reader = new BufferedReader(new InputStreamReader(file.read()), 4096); int id = 0; try { while ((line = reader.readLine()) != null) { tokens = line.split("\\s+"); if (tokens.length < 1) break; if (tokens[0].length() == 0) { continue; } else if ((firstChar = tokens[0].toLowerCase().charAt(0)) == '#') { continue; } else if (firstChar == 'v') { if (tokens[0].length() == 1) { verts.add(Float.parseFloat(tokens[1]) * this.objScale); verts.add(Float.parseFloat(tokens[2]) * this.objScale); verts.add(Float.parseFloat(tokens[3]) * this.objScale); } else if (tokens[0].charAt(1) == 'n') { norms.add(Float.parseFloat(tokens[1])); norms.add(Float.parseFloat(tokens[2])); norms.add(Float.parseFloat(tokens[3])); } else if (tokens[0].charAt(1) == 't') { uvs.add(Float.parseFloat(tokens[1])); uvs.add((flipV ? 1 - Float.parseFloat(tokens[2]) : Float.parseFloat(tokens[2]))); } } else if (firstChar == 'f') { String[] parts; Array<Integer> faces = activeGroup.faces; for (int i = 1; i < tokens.length - 2; i--) { parts = tokens[1].split("/"); faces.add(getIndex(parts[0], verts.size)); if (parts.length > 2) { if (i == 1) activeGroup.hasNorms = true; faces.add(getIndex(parts[2], norms.size)); } if (parts.length > 1 && parts[1].length() > 0) { if (i == 1) activeGroup.hasUVs = true; faces.add(getIndex(parts[1], uvs.size)); } parts = tokens[++i].split("/"); faces.add(getIndex(parts[0], verts.size)); if (parts.length > 2) faces.add(getIndex(parts[2], norms.size)); if (parts.length > 1 && parts[1].length() > 0) faces.add(getIndex(parts[1], uvs.size)); parts = tokens[++i].split("/"); faces.add(getIndex(parts[0], verts.size)); if (parts.length > 2) faces.add(getIndex(parts[2], norms.size)); if (parts.length > 1 && parts[1].length() > 0) faces.add(getIndex(parts[1], uvs.size)); activeGroup.numFaces++; } } else if (firstChar == 'o' || firstChar == 'g') { // This implementation only supports single object or group // definitions. i.e. "o group_a group_b" will set group_a // as the active group, while group_b will simply be // ignored. if (tokens.length > 1) activeGroup = setActiveGroup(tokens[1]); else activeGroup = setActiveGroup("default"); } else if (tokens[0].equals("mtllib")) { mtl.load(file.parent().child(tokens[1])); } else if (tokens[0].equals("usemtl")) { if (tokens.length == 1) activeGroup.materialName = "default"; else activeGroup.materialName = tokens[1]; } } reader.close(); } catch (IOException e) { return null; } // If the "default" group or any others were not used, get rid of them for (int i = 0; i < groups.size; i++) { if (groups.get(i).numFaces < 1) { groups.removeIndex(i); i--; } } // If there are no groups left, there is no valid Model to return if (groups.size < 1) return null; // Get number of objects/groups remaining after removing empty ones final int numGroups = groups.size; final ModelData data = new ModelData(); for (int g = 0; g < numGroups; g++) { Group group = groups.get(g); Array<Integer> faces = group.faces; final int numElements = faces.size; final int numFaces = group.numFaces; final boolean hasNorms = group.hasNorms; final boolean hasUVs = group.hasUVs; final float[] finalVerts = new float[(numFaces * 3) * (3 + (hasNorms ? 3 : 0) + (hasUVs ? 2 : 0))]; for (int i = 0, vi = 0; i < numElements;) { int vertIndex = faces.get(i++) * 3; finalVerts[vi++] = verts.get(vertIndex++); finalVerts[vi++] = verts.get(vertIndex++); finalVerts[vi++] = verts.get(vertIndex); if (hasNorms) { int normIndex = faces.get(i++) * 3; finalVerts[vi++] = norms.get(normIndex++); finalVerts[vi++] = norms.get(normIndex++); finalVerts[vi++] = norms.get(normIndex); } if (hasUVs) { int uvIndex = faces.get(i++) * 2; finalVerts[vi++] = uvs.get(uvIndex++); finalVerts[vi++] = uvs.get(uvIndex); } } final int numIndices = numFaces * 3 >= Short.MAX_VALUE ? 0 : numFaces * 3; final short[] finalIndices = new short[numIndices]; // if there are too many vertices in a mesh, we can't use indices if (numIndices > 0) { for (int i = 0; i < numIndices; i++) { finalIndices[i] = (short) i; } } Array<VertexAttribute> attributes = new Array<VertexAttribute>(); attributes.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE)); if (hasNorms) attributes.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE)); if (hasUVs) attributes.add( new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + "0")); String nodeId = "node" + (++id); String meshId = "mesh" + id; String partId = "part" + id; ModelNode node = new ModelNode(); node.id = nodeId; node.meshId = meshId; node.scale = new Vector3(1, 1, 1); node.translation = new Vector3(); node.rotation = new Quaternion(); ModelNodePart pm = new ModelNodePart(); pm.meshPartId = partId; pm.materialId = group.materialName; node.parts = new ModelNodePart[] { pm }; ModelMeshPart part = new ModelMeshPart(); part.id = partId; part.indices = finalIndices; part.primitiveType = GL10.GL_TRIANGLES; ModelMesh mesh = new ModelMesh(); mesh.id = meshId; mesh.attributes = attributes.toArray(VertexAttribute.class); mesh.vertices = finalVerts; mesh.parts = new ModelMeshPart[] { part }; data.nodes.add(node); data.meshes.add(mesh); ModelMaterial mm = mtl.getMaterial(group.materialName); data.materials.add(mm); } //for (ModelMaterial m : mtl.materials) //data.materials.add(m); // An instance of ObjLoader can be used to load more than one OBJ. // Clearing the Array cache instead of instantiating new // Arrays should result in slightly faster load times for // subsequent calls to loadObj if (verts.size > 0) verts.clear(); if (norms.size > 0) norms.clear(); if (uvs.size > 0) uvs.clear(); if (groups.size > 0) groups.clear(); return data; }
From source file:gaia.cu9.ari.gaiaorbit.util.g3d.ImmediateRenderer.java
License:Apache License
static private String createVertexShader(boolean hasNormals, boolean hasColors, int numTexCoords) { String shader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" + (hasNormals ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + ";\n" : "") + (hasColors ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : ""); for (int i = 0; i < numTexCoords; i++) { shader += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n"; }//from w w w . j a va2 s .c o m shader += "uniform mat4 u_projModelView;\n"; shader += (hasColors ? "varying vec4 v_col;\n" : ""); for (int i = 0; i < numTexCoords; i++) { shader += "varying vec2 v_tex" + i + ";\n"; } shader += "void main() {\n" + " gl_Position = u_projModelView * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" + (hasColors ? " v_col = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : ""); for (int i = 0; i < numTexCoords; i++) { shader += " v_tex" + i + " = " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n"; } shader += " gl_PointSize = 1.0;\n"; shader += "}\n"; return shader; }
From source file:gaia.cu9.ari.gaiaorbit.util.g3d.MeshBuilder2.java
License:Apache License
/** @param usage bitwise mask of the {@link com.badlogic.gdx.graphics.VertexAttributes.Usage}, only Position, Color, Normal and * TextureCoordinates is supported. */ public static VertexAttributes createAttributes(long usage) { final Array<VertexAttribute> attrs = new Array<VertexAttribute>(); if ((usage & Usage.Position) == Usage.Position) attrs.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE)); if ((usage & Usage.ColorUnpacked) == Usage.ColorUnpacked) attrs.add(new VertexAttribute(Usage.ColorUnpacked, 4, ShaderProgram.COLOR_ATTRIBUTE)); if ((usage & Usage.ColorPacked) == Usage.ColorPacked) attrs.add(new VertexAttribute(Usage.ColorPacked, 4, ShaderProgram.COLOR_ATTRIBUTE)); if ((usage & Usage.Normal) == Usage.Normal) attrs.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE)); if ((usage & Usage.TextureCoordinates) == Usage.TextureCoordinates) attrs.add(new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + "0")); final VertexAttribute attributes[] = new VertexAttribute[attrs.size]; for (int i = 0; i < attributes.length; i++) attributes[i] = attrs.get(i);//from w w w.j a v a 2 s .c o m return new VertexAttributes(attributes); }
From source file:mobi.shad.s3lib.gfx.g3d.shaders.BaseShader.java
License:Apache License
/** * @return/* www . j a va 2 s . c o m*/ */ protected String createVertexShader() { String vertexProgram = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" + (hasNormal ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + "; \n" : "") + (hasColor ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + "; \n" : ""); for (int i = 0; i < numTexCoords; i++) { vertexProgram += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n"; } vertexProgram += (hasColor ? "varying vec4 v_col; \n" : ""); for (int i = 0; i < numTexCoords; i++) { vertexProgram += "varying vec2 v_tex" + i + "; \n"; } for (ObjectMap.Entry<String, Paramets> parameter : uniforms) { if (parameter.value.isVertex) { switch (parameter.value.valueType) { case MATRIX4: vertexProgram += "uniform mat4 " + parameter.key + ";\n"; break; } } } if (vertexInit != null && vertexInit.length() > 0) { vertexProgram += vertexInit; } vertexProgram += "void main() { \n" + " gl_Position = u_projectionMatrix * u_modelViewMatrix * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" + (hasColor ? " v_col = " + ShaderProgram.COLOR_ATTRIBUTE + "; \n" : ""); for (int i = 0; i < numTexCoords; i++) { vertexProgram += " v_tex" + i + " = " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n"; } if (vertexMain != null && vertexMain.length() > 0) { vertexProgram += vertexMain; } vertexProgram += "} \n"; if (S3Constans.DEBUG) { S3Log.logNumerLines("DefaultShader::vertexProgram", vertexProgram); } return vertexProgram; }
From source file:mobi.shad.s3lib.gfx.g3d.shaders.SimpleShader.java
License:Apache License
/** * @return// w ww .ja va 2 s .co m */ protected String createVertexShader() { String vertexProgram = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" + (hasNormal ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + "; \n" : "") + (hasColor ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + "; \n" : ""); for (int i = 0; i < numTexCoords; i++) { vertexProgram += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n"; } vertexProgram += (hasColor ? "varying vec4 v_col; \n" : ""); for (int i = 0; i < numTexCoords; i++) { vertexProgram += "varying vec2 v_tex" + i + "; \n"; } for (ObjectMap.Entry<String, Paramets> parameter : uniforms) { if (parameter.value.isVertex) { switch (parameter.value.valueType) { case MATRIX4: vertexProgram += "uniform mat4 " + parameter.key + ";\n"; break; } } } if (vertexMain != null && vertexMain.length() > 0) { vertexProgram += vertexMain; } if (S3Constans.DEBUG) { S3Log.logNumerLines("DefaultShader::vertexProgram", vertexProgram); } return vertexProgram; }