diff --git a/pixelgl/vertex.go b/pixelgl/vertex.go
index b1faa401bb22c76528808ea60e57d96628063972..7ab94c70846b62d138c84c613c0c45f060b912a3 100644
--- a/pixelgl/vertex.go
+++ b/pixelgl/vertex.go
@@ -136,18 +136,10 @@ func NewVertexArray(parent Doer, format VertexFormat, mode VertexDrawMode, usage
 					size = 4
 				}
 
-				var xtype uint32
-				switch attr.Type {
-				case Int:
-					xtype = gl.INT
-				case Float, Vec2, Vec3, Vec4:
-					xtype = gl.FLOAT
-				}
-
 				gl.VertexAttribPointer(
 					uint32(location),
 					size,
-					xtype,
+					gl.FLOAT,
 					false,
 					int32(va.stride),
 					gl.PtrOffset(offset),
@@ -248,32 +240,6 @@ func (va *VertexArray) checkVertex(vertex int) {
 	}
 }
 
-// SetVertexAttributeInt sets the value of a specified vertex attribute Attr{Purpose: purpose, Type: Int} of type Int
-// of the specified vertex.
-//
-// This function returns false if the specified vertex attribute does not exist. Note that the function panics if
-// the vertex if out of range.
-func (va *VertexArray) SetVertexAttributeInt(vertex int, purpose AttrPurpose, value int32) (ok bool) {
-	va.checkVertex(vertex)
-	attr := Attr{Purpose: purpose, Type: Int}
-	if _, ok := va.attrs[attr]; !ok {
-		return false
-	}
-	DoNoBlock(func() {
-		gl.BindBuffer(gl.ARRAY_BUFFER, va.vbo)
-
-		offset := va.stride*vertex + va.attrs[attr]
-		gl.BufferSubData(gl.ARRAY_BUFFER, offset, attr.Type.Size(), unsafe.Pointer(&value))
-
-		gl.BindBuffer(gl.ARRAY_BUFFER, 0)
-
-		if err := getLastGLErr(); err != nil {
-			panic(errors.Wrap(err, "set attribute vertex"))
-		}
-	})
-	return true
-}
-
 // SetVertexAttributeFloat sets the value of a specified vertex attribute Attr{Purpose: purpose, Type: Float} of type Float
 // of the specified vertex.
 //
diff --git a/window.go b/window.go
index f7e44ec4877299ce02ac7ea8922fe9442aca2124..46195d9737b21959b5c0a3a14f70563e034de980 100644
--- a/window.go
+++ b/window.go
@@ -315,14 +315,14 @@ func (w *Window) Do(sub func(pixelgl.Context)) {
 }
 
 var defaultVertexFormat = pixelgl.VertexFormat{
-	"position":  {Purpose: pixelgl.Position, Type: pixelgl.Vec2},
-	"color":     {Purpose: pixelgl.Color, Type: pixelgl.Vec4},
-	"texCoord":  {Purpose: pixelgl.TexCoord, Type: pixelgl.Vec2},
-	"isTexture": {Purpose: pixelgl.IsTexture, Type: pixelgl.Int},
+	"position": {Purpose: pixelgl.Position, Type: pixelgl.Vec2},
+	"color":    {Purpose: pixelgl.Color, Type: pixelgl.Vec4},
+	"texCoord": {Purpose: pixelgl.TexCoord, Type: pixelgl.Vec2},
 }
 
 var defaultUniformFormat = pixelgl.UniformFormat{
 	"transform": {Purpose: pixelgl.Transform, Type: pixelgl.Mat3},
+	"isTexture": {Purpose: pixelgl.IsTexture, Type: pixelgl.Int},
 }
 
 var defaultVertexShader = `
@@ -331,11 +331,9 @@ var defaultVertexShader = `
 in vec2 position;
 in vec4 color;
 in vec2 texCoord;
-in int isTexture;
 
 out vec4 Color;
 out vec2 TexCoord;
-out int IsTexture;
 
 uniform mat3 transform;
 
@@ -343,7 +341,6 @@ void main() {
 	gl_Position = vec4((transform * vec3(position.x, position.y, 1.0)).xy, 0.0, 1.0);
 	Color = color;
 	TexCoord = texCoord;
-	IsTexture = isTexture;
 }
 `
 
@@ -352,14 +349,14 @@ var defaultFragmentShader = `
 
 in vec4 Color;
 in vec2 TexCoord;
-in int IsTexture;
 
 out vec4 color;
 
+uniform int isTexture;
 uniform sampler2D tex;
 
 void main() {
-	if (IsTexture != 0) {
+	if (isTexture != 0) {
 		color = Color * texture(tex, vec2(TexCoord.x, 1 - TexCoord.y));
 	} else {
 		color = Color;