本文整理汇总了Golang中github.com/go-gl/gl.ActiveTexture函数的典型用法代码示例。如果您正苦于以下问题:Golang ActiveTexture函数的具体用法?Golang ActiveTexture怎么用?Golang ActiveTexture使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ActiveTexture函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: assign
func (s *Shader) assign(ptr unsafe.Pointer, val reflect.Value, typ reflect.Type, name string) error {
u := s.prog.GetUniformLocation(name)
if u < 0 {
return fmt.Errorf("gfx: unknown uniform variable '%s'", name)
}
if typ.Kind() == reflect.Ptr {
if s.assignPrimitive(unsafe.Pointer(val.Pointer()), typ.Elem(), u) {
return nil
}
} else if s.assignPrimitive(ptr, typ, u) {
return nil
}
iface := val.Interface()
switch iface.(type) {
// special types
case *Sampler2D:
sampler := iface.(*Sampler2D)
texunit := s.texunit(u)
gl.ActiveTexture(gl.TEXTURE0 + gl.GLenum(texunit))
sampler.bind()
u.Uniform1i(texunit)
default:
return fmt.Errorf("gfx: invalid uniform type %v", typ)
}
return nil
}
示例2: handleText
func handleText(camera *PerspectiveCamera, text *Text) {
// Material
material := text.Material()
program := material.Program()
if program == nil {
program = createTextProgram(text)
material.SetProgram(program)
}
program.Use()
defer program.Unuse()
if c, ok := material.(Colored); ok {
if c.Color() != nil {
program.uniforms["diffuse"].apply(c.Color())
}
}
if t, ok := material.(Textured); ok {
texture := t.Texture()
if texture != nil {
gl.ActiveTexture(gl.TEXTURE0)
texture.Bind()
defer texture.Unbind()
program.uniforms["texture"].apply(texture)
}
}
for _, attribute := range program.attributes {
attribute.enable()
defer attribute.disable()
attribute.bindBuffer()
defer attribute.unbindBuffer()
attribute.pointer()
attribute.bindBuffer()
}
vertexAttrib := gl.AttribLocation(0)
vertexAttrib.EnableArray()
defer vertexAttrib.DisableArray()
text.vertexBuffer.Bind(gl.ARRAY_BUFFER)
defer text.vertexBuffer.Unbind(gl.ARRAY_BUFFER)
vertexAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil)
if t, ok := material.(Wireframed); ok {
if t.Wireframe() {
gl.PolygonMode(gl.FRONT_AND_BACK, gl.LINE)
} else {
gl.PolygonMode(gl.FRONT_AND_BACK, gl.FILL)
}
}
gl.Enable(gl.BLEND)
gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
gl.DrawArrays(gl.TRIANGLES, 0, len(text.Geometry().Vertices))
}
示例3: Enter
func (bank *TextureBank) Enter() {
for key, value := range bank.Samplers {
value.Parameters(&bank.SamplerParameters[key])
}
for key, value := range bank.Units {
gl.ActiveTexture(gl.TEXTURE0 + gl.GLenum(key))
value.Texture.Bind(value.Target)
value.Sampler.Bind(gl.GLuint(key))
}
}
示例4: Tick
func Tick() {
timer = float32(glfw.Time())
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
program.Use()
camera.Tick()
modelViewMatrixUniform.UniformMatrix4fv(camera.modelViewMatrix[:])
projectionMatrixUniform.UniformMatrix4fv(camera.projectionMatrix[:])
timerUniform.Uniform1f(timer)
positionAttrib.EnableArray()
texcoordAttrib.EnableArray()
gl.ActiveTexture(gl.TEXTURE0)
textures[0].Bind(gl.TEXTURE_2D)
textureUniforms[0].Uniform1i(0)
gl.ActiveTexture(gl.TEXTURE1)
textures[1].Bind(gl.TEXTURE_2D)
textureUniforms[1].Uniform1i(1)
sizeOfVertex := int(unsafe.Sizeof(Vertex{}))
posoffset := uintptr(0)
texoffset := unsafe.Offsetof(Vertex{}.texcoord)
for _, renderObject := range renderObjects {
renderObject.vertexBuffer.Bind(gl.ARRAY_BUFFER)
positionAttrib.AttribPointer(3, gl.FLOAT, false, sizeOfVertex, posoffset)
texcoordAttrib.AttribPointer(2, gl.FLOAT, false, sizeOfVertex, texoffset)
gl.DrawArrays(gl.TRIANGLES, 0, renderObject.numVerticies)
}
positionAttrib.DisableArray()
texcoordAttrib.DisableArray()
gl.ProgramUnuse()
glfw.SwapBuffers()
}
示例5: DrawScreen
func (sp *Sprite) DrawScreen() {
if sp.Texture != nil && sp.Render {
camera := GetScene().SceneBase().Camera
pos := sp.Transform().WorldPosition()
scale := sp.Transform().WorldScale()
TextureMaterial.Begin(sp.GameObject())
mp := TextureMaterial.ProjMatrix
mv := TextureMaterial.ViewMatrix
mm := TextureMaterial.ModelMatrix
tx := TextureMaterial.Texture
ac := TextureMaterial.AddColor
ti := TextureMaterial.Tiling
of := TextureMaterial.Offset
defaultBuffer.Bind(gl.ARRAY_BUFFER)
TextureMaterial.Verts.EnableArray()
TextureMaterial.Verts.AttribPointer(3, gl.FLOAT, false, 0, uintptr(0))
TextureMaterial.UV.EnableArray()
TextureMaterial.UV.AttribPointer(2, gl.FLOAT, false, 0, uintptr(12*4))
currentUV := sp.UVs[int(sp.animation)]
view := Identity()
model := Identity()
model.Scale(scale.X*currentUV.Ratio, scale.Y, 1)
model.Translate((float32(Width)/2)+pos.X+0.75, (float32(Height)/2)+pos.Y+0.75, 1)
mv.UniformMatrix4fv(false, view)
mp.UniformMatrix4f(false, (*[16]float32)(camera.Projection))
mm.UniformMatrix4fv(false, model)
ti.Uniform2f((currentUV.U2-currentUV.U1)*sp.Tiling.X, (currentUV.V2-currentUV.V1)*sp.Tiling.Y)
of.Uniform2f(currentUV.U1, currentUV.V1)
sp.Bind()
gl.ActiveTexture(gl.TEXTURE0)
tx.Uniform1i(0)
//ac.Uniform4f(1, 1, 1, 0)
ac.Uniform4f(sp.Color.R, sp.Color.G, sp.Color.B, sp.Color.A)
gl.DrawArrays(gl.QUADS, 0, 4)
TextureMaterial.End(sp.GameObject())
}
}
示例6: setUniforms
func (d *DrawImage) setUniforms() error {
p := d.program
gl.ActiveTexture(gl.TEXTURE0)
d.Image.atlas.bind()
panicGlError()
loc := p.GetUniformLocation("mysample")
loc.Uniform1i(0)
panicGlError()
worldMatrix := p.GetUniformLocation("MVP")
worldMatrix.UniformMatrix4f(false, ptrForMatrix(d.mvp))
panicGlError()
return nil
}
示例7: renderOne
func (self *OpenGLRenderer) renderOne(operation render.RenderOperation, renderState RenderState) {
mesh := operation.Mesh
material := operation.Material
transform := operation.Transform
// No attributes? no loaded or empty? Better way to handle this than spamming
// the console?
if mesh.VertexArrayObj == nil {
log.Println("WARNING: Trying to render an invalid mesh", mesh)
return
}
vertexArrayObj := mesh.VertexArrayObj.(gl.VertexArray)
vertexArrayObj.Bind()
material.Shader.Program.Use()
material.Shader.Program.SetUniformMatrix(
"modelViewProjection",
renderState.ViewProjection.Times(transform),
)
if material.Texture != nil {
glTexture := material.Texture.Id.(gl.Texture)
gl.ActiveTexture(gl.TEXTURE0)
if !material.IsCubeMap {
glTexture.Bind(gl.TEXTURE_2D)
defer glTexture.Unbind(gl.TEXTURE_2D)
material.Shader.Program.SetUniformUnit("textureSampler", 0)
} else {
gl.Disable(gl.DEPTH_TEST)
defer gl.Enable(gl.DEPTH_TEST)
glTexture.Bind(gl.TEXTURE_CUBE_MAP)
defer glTexture.Unbind(gl.TEXTURE_CUBE_MAP)
material.Shader.Program.SetUniformUnit("cubeMap", 0)
}
}
if len(mesh.IndexList) == 0 {
gl.DrawArrays(gl.TRIANGLES, 0, len(mesh.VertexList)*3)
} else {
gl.DrawElements(gl.TRIANGLES, len(mesh.IndexList), gl.UNSIGNED_INT, nil)
}
}
示例8: SetGl
func (unif *UniformsLocInstanced) SetGl() {
gl.ActiveTexture(gl.TEXTURE0)
if err := CheckGlError(); err != nil {
err.Description = "gl.ActiveTexture(gl.TEXTURE0)"
panic(err)
}
globaltexture.Bind(gl.TEXTURE_CUBE_MAP)
if err := CheckGlError(); err != nil {
err.Description = "gl.Texture(1).Bind(gl.TEXTURE_CUBE_MAP)"
panic(err)
}
unif.textureLoc.Uniform1i(0)
if err := CheckGlError(); err != nil {
err.Description = "unif.textureloc.Uniform1i(0)"
panic(err)
}
}
示例9: initGL
func (video *SDLVideo) initGL() {
if gl.Init() != 0 {
panic(sdl.GetError())
}
gl.ClearColor(0.0, 0.0, 0.0, 1.0)
gl.Enable(gl.CULL_FACE)
gl.Enable(gl.DEPTH_TEST)
video.prog = createProgram(vertShaderSrcDef, fragShaderSrcDef)
posAttrib := video.prog.GetAttribLocation("vPosition")
texCoordAttr := video.prog.GetAttribLocation("vTexCoord")
video.textureUni = video.prog.GetAttribLocation("texture")
video.texture = gl.GenTexture()
gl.ActiveTexture(gl.TEXTURE0)
video.texture.Bind(gl.TEXTURE_2D)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)
video.prog.Use()
posAttrib.EnableArray()
texCoordAttr.EnableArray()
vertVBO := gl.GenBuffer()
vertVBO.Bind(gl.ARRAY_BUFFER)
verts := []float32{-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0}
gl.BufferData(gl.ARRAY_BUFFER, len(verts)*int(unsafe.Sizeof(verts[0])), &verts[0], gl.STATIC_DRAW)
textCoorBuf := gl.GenBuffer()
textCoorBuf.Bind(gl.ARRAY_BUFFER)
texVerts := []float32{0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0}
gl.BufferData(gl.ARRAY_BUFFER, len(texVerts)*int(unsafe.Sizeof(texVerts[0])), &texVerts[0], gl.STATIC_DRAW)
posAttrib.AttribPointer(2, gl.FLOAT, false, 0, uintptr(0))
texCoordAttr.AttribPointer(2, gl.FLOAT, false, 0, uintptr(0))
}
示例10: main
func main() {
if err := glfw.Init(); err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
return
}
defer glfw.Terminate()
glfw.OpenWindowHint(glfw.FsaaSamples, 4)
glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3)
glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3)
glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
return
}
glfw.SetSwapInterval(0)
//gl.GlewExperimental(true)
gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked
gl.GetError() // ignore error, since we're telling it to use CoreProfile above, we get "invalid enumerant" (GLError 1280) which freaks the OpenGLSentinel out
glfw.SetWindowTitle("Tutorial 07")
glfw.Enable(glfw.StickyKeys)
glfw.Disable(glfw.MouseCursor) // Not in the original tutorial, but IMO it SHOULD be there
glfw.SetMousePos(1024.0/2.0, 768.0/2.0)
gl.ClearColor(0., 0., 0.4, 0.)
gl.Enable(gl.DEPTH_TEST)
gl.DepthFunc(gl.LESS)
gl.Enable(gl.CULL_FACE)
camera := input.NewCamera()
vertexArray := gl.GenVertexArray()
defer vertexArray.Delete()
vertexArray.Bind()
prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader")
defer prog.Delete()
matrixID := prog.GetUniformLocation("MVP")
texture := helper.MakeTextureFromTGA("uvmap.tga") // Had to convert to tga, go-gl is missing the texture method for DDS right now
defer texture.Delete()
texSampler := prog.GetUniformLocation("myTextureSampler")
meshObj := objloader.LoadObject("cube.obj")
vertices, uvs := meshObj.Vertices, meshObj.UVs
vertexBuffer := gl.GenBuffer()
defer vertexBuffer.Delete()
vertexBuffer.Bind(gl.ARRAY_BUFFER)
gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*3*4, vertices, gl.STATIC_DRAW)
uvBuffer := gl.GenBuffer()
defer uvBuffer.Delete()
uvBuffer.Bind(gl.ARRAY_BUFFER)
// UV doesn't seem to care
gl.BufferData(gl.ARRAY_BUFFER, len(uvs)*2*4, uvs, gl.STATIC_DRAW)
// Equivalent to a do... while
for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE && glfw.Key('Q') != glfw.KeyPress) {
func() {
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
prog.Use()
defer gl.ProgramUnuse()
view, proj := camera.ComputeViewPerspective()
model := mathgl.Ident4f()
MVP := proj.Mul4(view).Mul4(model)
matrixID.UniformMatrix4fv(false, MVP)
gl.ActiveTexture(gl.TEXTURE0)
texture.Bind(gl.TEXTURE_2D)
defer texture.Unbind(gl.TEXTURE_2D)
texSampler.Uniform1i(0)
vertexAttrib := gl.AttribLocation(0)
vertexAttrib.EnableArray()
defer vertexAttrib.DisableArray()
vertexBuffer.Bind(gl.ARRAY_BUFFER)
defer vertexBuffer.Unbind(gl.ARRAY_BUFFER)
vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil)
uvAttrib := gl.AttribLocation(1)
uvAttrib.EnableArray()
defer uvAttrib.DisableArray()
uvBuffer.Bind(gl.ARRAY_BUFFER)
defer uvBuffer.Unbind(gl.ARRAY_BUFFER)
uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil)
//.........这里部分代码省略.........
示例11: LoadSkybox
func LoadSkybox() {
gl.ActiveTexture(gl.TEXTURE0)
if err := CheckGlError(); err != nil {
panic(err)
}
t := gl.GenTexture()
if err := CheckGlError(); err != nil {
panic(err)
}
t.Bind(gl.TEXTURE_CUBE_MAP)
if err := CheckGlError(); err != nil {
panic(err)
}
const filename = "Skybox_tut13_384x256.png"
img, err := LoadImage(filename)
if err != nil {
panic(err)
}
size := img.Bounds().Size()
w := size.X
h := size.Y
if w/3 != h/2 {
panic("incorrect aspect ratio")
}
s := h / 2 // Size of one face of the cube.
targets := [...]gl.GLenum{
gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
gl.TEXTURE_CUBE_MAP_POSITIVE_X,
gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
gl.TEXTURE_CUBE_MAP_POSITIVE_Y,
gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,
gl.TEXTURE_CUBE_MAP_POSITIVE_Z,
}
rs := []image.Rectangle{
image.Rect(0*s, 0*s, 1*s, 1*s), // 0 side.
image.Rect(1*s, 0*s, 2*s, 1*s), // 1 side.
image.Rect(2*s, 0*s, 3*s, 1*s), // 2 side.
image.Rect(0*s, 1*s, 1*s, 2*s), // 3 bottom.
image.Rect(1*s, 1*s, 2*s, 2*s), // 4 top.
image.Rect(2*s, 1*s, 3*s, 2*s), // 5 side.
}
// redirect must end with 3 and 4. This places the floor at -z and the
// sky at +z.
// All the sides look properly oriented (grass down) on the +y side.
// Considering that the sky is properly oriented the way it is, then
// rectangle 5 contains the picture that matches it on the +y side.
// Therefore, redirect must end with 5, 3, 4.
// Problem now: all the other sides, and maybe the floor too, need to be
// rotated in order to line up, that is having their sky on top.
redirect := [...]int{0, 2, 1, 5, 3, 4}
ID := matrix23{1, 0, 0, 1, 0, 0}
ms := [...]matrix23{
matrix23{0, -1, 1, 0, 0, s - 1},
matrix23{0, 1, -1, 0, s - 1, 0},
matrix23{-1, 0, 0, -1, s - 1, s - 1},
ID,
matrix23{-1, 0, 0, -1, s - 1, s - 1},
ID,
}
rgba := forceRGBA(img)
for i, target := range targets {
subimage := rgba.SubImage(rs[redirect[i]])
data := GlRgba(subimage, ms[i])
gl.TexImage2D(
target,
0, // Mipmap level.
gl.SRGB8_ALPHA8, // Format inside OpenGL.
s, // Width.
s, // Height.
0, // Border. Doc says it must be 0.
gl.RGBA, // Format of the data that...
gl.UNSIGNED_BYTE, // ... I give to OpenGL.
data, // And the data itself.
)
if err := CheckGlError(); err != nil {
panic(err)
}
}
const target = gl.TEXTURE_CUBE_MAP
gl.GenerateMipmap(target)
if err := CheckGlError(); err != nil {
panic(err)
}
gl.TexParameteri(target, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR)
if err := CheckGlError(); err != nil {
panic(err)
}
gl.TexParameteri(target, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
if err := CheckGlError(); err != nil {
panic(err)
}
//.........这里部分代码省略.........
示例12: LoadTexture
func LoadTexture() {
gl.ActiveTexture(gl.TEXTURE0)
if err := CheckGlError(); err != nil {
panic(err)
}
t := gl.GenTexture()
if err := CheckGlError(); err != nil {
panic(err)
}
const target = gl.TEXTURE_2D
t.Bind(target)
if err := CheckGlError(); err != nil {
panic(err)
}
img, err := LoadImage("test.jpg")
if err != nil {
panic(err)
}
data := GlRgba(img, matrix23{1, 0, 0, 1, 0, 0})
size := img.Bounds().Size()
gl.TexImage2D(
target,
0, // Mipmap level.
gl.SRGB8_ALPHA8, // Format inside OpenGL.
size.X, // Width.
size.Y, // Height.
0, // Border. Doc says it must be 0.
gl.RGBA, // Format of the data that...
gl.UNSIGNED_BYTE, // ... I give to OpenGL.
data, // And the data itself.
)
if err := CheckGlError(); err != nil {
panic(err)
}
gl.GenerateMipmap(target)
if err := CheckGlError(); err != nil {
panic(err)
}
gl.TexParameteri(target, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR)
if err := CheckGlError(); err != nil {
panic(err)
}
gl.TexParameteri(target, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
if err := CheckGlError(); err != nil {
panic(err)
}
gl.TexParameteri(target, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE)
if err := CheckGlError(); err != nil {
panic(err)
}
gl.TexParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
if err := CheckGlError(); err != nil {
panic(err)
}
t.Unbind(target)
globaltexture = t
}
示例13: handleElement
func handleElement(camera *PerspectiveCamera, element SceneObject) {
// Material
material := element.Material()
program := material.Program()
if program == nil {
program = createProgram(element)
material.SetProgram(program)
}
program.Use()
defer program.Unuse()
view := camera.Transform.modelMatrix().Inv()
model := element.Transform().modelMatrix()
projection := camera.projectionMatrix
MVP := projection.Mul4(view).Mul4(model)
// Set model view projection matrix
program.uniforms["MVP"].apply(MVP)
program.uniforms["M"].apply(model)
program.uniforms["V"].apply(view)
// Light position
lightPos := mgl32.Vec3{4., 4., 4.}
program.uniforms["LightPosition_worldspace"].apply(lightPos)
if c, ok := material.(Colored); ok {
if c.Color() != nil {
program.uniforms["diffuse"].apply(c.Color())
}
}
if t, ok := material.(Textured); ok {
texture := t.Texture()
if texture != nil {
gl.ActiveTexture(gl.TEXTURE0)
texture.Bind()
defer texture.Unbind()
program.uniforms["texture"].apply(texture)
program.uniforms["repeat"].apply(texture.Repeat)
}
}
for _, attribute := range program.attributes {
attribute.enable()
defer attribute.disable()
attribute.bindBuffer()
defer attribute.unbindBuffer()
attribute.pointer()
attribute.bindBuffer()
}
vertexAttrib := gl.AttribLocation(0)
vertexAttrib.EnableArray()
defer vertexAttrib.DisableArray()
element.VertexBuffer().Bind(gl.ARRAY_BUFFER)
defer element.VertexBuffer().Unbind(gl.ARRAY_BUFFER)
vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil)
if t, ok := material.(Wireframed); ok {
if t.Wireframe() {
gl.PolygonMode(gl.FRONT_AND_BACK, gl.LINE)
} else {
gl.PolygonMode(gl.FRONT_AND_BACK, gl.FILL)
}
}
// If index available
index := element.Index()
if index != nil && index.count > 0 {
index.enable()
defer index.disable()
gl.DrawElements(gl.TRIANGLES, index.count, gl.UNSIGNED_SHORT, nil)
} else {
gl.DrawArrays(element.Mode(), 0, element.Geometry().ArrayCount())
}
}
示例14: main
func main() {
runtime.LockOSThread()
if !glfw.Init() {
fmt.Fprintf(os.Stderr, "Can't open GLFW")
return
}
defer glfw.Terminate()
glfw.WindowHint(glfw.Samples, 4)
glfw.WindowHint(glfw.ContextVersionMajor, 3)
glfw.WindowHint(glfw.ContextVersionMinor, 3)
glfw.WindowHint(glfw.OpenglProfile, glfw.OpenglCoreProfile)
glfw.WindowHint(glfw.OpenglForwardCompatible, glfw.True) // needed for macs
window, err := glfw.CreateWindow(1024, 768, "Tutorial 7", nil, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
return
}
window.MakeContextCurrent()
gl.Init()
gl.GetError() // Ignore error
window.SetInputMode(glfw.StickyKeys, 1)
window.SetCursorPosition(1024/2, 768/2)
window.SetInputMode(glfw.Cursor, glfw.CursorHidden)
gl.ClearColor(0., 0., 0.4, 0.)
gl.Enable(gl.DEPTH_TEST)
gl.DepthFunc(gl.LESS)
gl.Enable(gl.CULL_FACE)
camera := input.NewCamera(window)
vertexArray := gl.GenVertexArray()
defer vertexArray.Delete()
vertexArray.Bind()
prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader")
defer prog.Delete()
matrixID := prog.GetUniformLocation("MVP")
texture, err := helper.TextureFromDDS("uvmap.DDS")
if err != nil {
fmt.Println("Couldn't load texture")
return
}
defer texture.Delete()
texSampler := prog.GetUniformLocation("myTextureSampler")
meshObj := objloader.LoadObject("cube.obj", true)
vertices, uvs := meshObj.Vertices, meshObj.UVs
vertexBuffer := gl.GenBuffer()
defer vertexBuffer.Delete()
vertexBuffer.Bind(gl.ARRAY_BUFFER)
gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*3*4, vertices, gl.STATIC_DRAW)
uvBuffer := gl.GenBuffer()
defer uvBuffer.Delete()
uvBuffer.Bind(gl.ARRAY_BUFFER)
// UV doesn't seem to care
gl.BufferData(gl.ARRAY_BUFFER, len(uvs)*2*4, uvs, gl.STATIC_DRAW)
// Equivalent to a do... while
for ok := true; ok; ok = (window.GetKey(glfw.KeyEscape) != glfw.Press && !window.ShouldClose()) {
func() {
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
prog.Use()
defer gl.ProgramUnuse()
view, proj := camera.ComputeViewPerspective()
model := mgl32.Ident4()
MVP := proj.Mul4(view).Mul4(model)
matrixID.UniformMatrix4fv(false, MVP)
gl.ActiveTexture(gl.TEXTURE0)
texture.Bind(gl.TEXTURE_2D)
defer texture.Unbind(gl.TEXTURE_2D)
texSampler.Uniform1i(0)
vertexAttrib := gl.AttribLocation(0)
vertexAttrib.EnableArray()
defer vertexAttrib.DisableArray()
vertexBuffer.Bind(gl.ARRAY_BUFFER)
defer vertexBuffer.Unbind(gl.ARRAY_BUFFER)
vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil)
uvAttrib := gl.AttribLocation(1)
uvAttrib.EnableArray()
defer uvAttrib.DisableArray()
//.........这里部分代码省略.........
示例15: Run
//.........这里部分代码省略.........
}
case sdl.K_F5:
if e.Type == sdl.KEYDOWN {
event = &LoadStateEvent{}
}
case sdl.K_F8:
if e.Type == sdl.KEYDOWN {
event = &FPSEvent{2.}
}
case sdl.K_F9:
if e.Type == sdl.KEYDOWN {
event = &FPSEvent{1.}
}
case sdl.K_F10:
if e.Type == sdl.KEYDOWN {
event = &FPSEvent{.75}
}
case sdl.K_F11:
if e.Type == sdl.KEYDOWN {
event = &FPSEvent{.5}
}
case sdl.K_F12:
if e.Type == sdl.KEYDOWN {
event = &FPSEvent{.25}
}
case sdl.K_KP0:
if e.Type == sdl.KEYDOWN {
event = &MuteEvent{}
}
case sdl.K_KP1:
if e.Type == sdl.KEYDOWN {
event = &MutePulse1Event{}
}
case sdl.K_KP2:
if e.Type == sdl.KEYDOWN {
event = &MutePulse2Event{}
}
case sdl.K_KP3:
if e.Type == sdl.KEYDOWN {
event = &MuteTriangleEvent{}
}
case sdl.K_KP4:
if e.Type == sdl.KEYDOWN {
event = &MuteNoiseEvent{}
}
case sdl.K_KP5:
if e.Type == sdl.KEYDOWN {
event = &MuteDMCEvent{}
}
}
if event == nil && running {
event = &ControllerEvent{
Button: button(e),
Down: e.Type == sdl.KEYDOWN,
}
}
}
if event != nil {
go func() { video.events <- event }()
}
case colors := <-video.input:
index := 0
x, y := 0, 0
for _, c := range colors {
if pixelInFrame(x, y, video.overscan) {
frame[index] = video.palette[c]
index++
}
switch x {
case 255:
x = 0
y++
default:
x++
}
}
video.framePool.Put(colors)
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
video.prog.Use()
gl.ActiveTexture(gl.TEXTURE0)
video.texture.Bind(gl.TEXTURE_2D)
gl.TexImage2D(gl.TEXTURE_2D, 0, 3, video.frameWidth(), video.frameHeight(), 0, gl.RGBA,
gl.UNSIGNED_INT_8_8_8_8, frame)
gl.DrawArrays(gl.TRIANGLES, 0, 6)
if video.screen != nil {
sdl.GL_SwapBuffers()
}
}
}
}