Мне нужна помощь в том, почему этот кусок кода создает пустое зеленое окно. Я сделал это, объединив примеры из https://github.com/Jragonmiris/mathgl/blob/master/examples/opengl-tutorial/tutorial02/main.go и https://github.com/veandco/go-sdl2/blob/master/examples/opengl3.go. Наверное, я не уверен, что это ошибка в структуре GoLang sdl/gl или проблема с моим пониманием OpenGL. Все это должно рисовать куб.Go Lang OpenGL простая форма - пустой экран
Мой код:
пакета главных
import (
"fmt"
// gl "github.com/chsc/gogl/gl33"
"github.com/veandco/go-sdl2/sdl"
// "math"
"github.com/Jragonmiris/mathgl"
"github.com/go-gl/gl"
"runtime"
"time"
)
// var program gl.Program = 0
// var buffer gl.Buffer = 0
func MakeProgram(vert, frag string) gl.Program {
vertShader, fragShader := gl.CreateShader(gl.VERTEX_SHADER), gl.CreateShader(gl.FRAGMENT_SHADER)
vertShader.Source(vert)
fragShader.Source(frag)
vertShader.Compile()
fragShader.Compile()
prog := gl.CreateProgram()
prog.AttachShader(vertShader)
prog.AttachShader(fragShader)
prog.Link()
prog.Validate()
fmt.Println(prog.GetInfoLog())
return prog
}
func main() {
var window *sdl.Window
var context sdl.GLContext
var event sdl.Event
var running bool
var err error
runtime.LockOSThread()
if 0 != sdl.Init(sdl.INIT_EVERYTHING) {
panic(sdl.GetError())
}
window, err = sdl.CreateWindow(winTitle, sdl.WINDOWPOS_UNDEFINED,
sdl.WINDOWPOS_UNDEFINED,
winWidth, winHeight, sdl.WINDOW_OPENGL)
if err != nil {
panic(err)
}
if window == nil {
panic(sdl.GetError())
}
context = sdl.GL_CreateContext(window)
if context == nil {
panic(sdl.GetError())
}
if gl.Init() != 0 {
panic("gl error")
}
gl.ClearColor(1.0, 1.0, 1.0, .5)
gl.Viewport(0, 0, winWidth, winHeight)
program := MakeProgram(vertexShaderSource, fragmentShaderSource)
defer program.Delete()
matrixID := program.GetUniformLocation("MVP")
Projection := mathgl.Perspective(45.0, 4.0/3.0, 0.1, 100.0)
View := mathgl.LookAt(4.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
Model := mathgl.Ident4f()
MVP := Projection.Mul4(View).Mul4(Model)
gl.Enable(gl.DEPTH_TEST)
gl.DepthFunc(gl.LESS)
gl.Enable(gl.BLEND)
gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
vertexArray := gl.GenVertexArray()
defer vertexArray.Delete()
vertexArray.Bind()
buffer := gl.GenBuffer()
defer buffer.Delete()
buffer.Bind(gl.ARRAY_BUFFER)
gl.BufferData(gl.ARRAY_BUFFER, len(triangle_vertices)*4, &triangle_vertices, gl.STATIC_DRAW)
running = true
for running {
for event = sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
switch t := event.(type) {
case *sdl.QuitEvent:
running = false
case *sdl.MouseMotionEvent:
fmt.Printf(string(t.Timestamp))
}
}
gl.Clear(gl.COLOR_BUFFER_BIT) // | gl.DEPTH_BUFFER_BIT)
program.Use()
matrixID.UniformMatrix4fv(false, MVP)
attribLoc := gl.AttribLocation(0)
attribLoc.EnableArray()
buffer.Bind(gl.ARRAY_BUFFER)
attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil)
gl.DrawArrays(gl.TRIANGLES, 0, 3)
attribLoc.DisableArray()
time.Sleep(50 * time.Millisecond)
sdl.GL_SwapWindow(window)
}
sdl.GL_DeleteContext(context)
window.Destroy()
sdl.Quit()
}
const (
winTitle = "OpenGL Shader"
winWidth = 640
winHeight = 480
vertexShaderSource = `
#version 330 core
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
// Values that stay constant for the whole mesh.
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4 (vertexPosition_modelspace,1.0);
}
`
fragmentShaderSource = `
#version 330 core
// Ouput data
out vec3 color;
void main()
{
// Output color = red
color = vec3(1,0,0);
}
`
)
var triangle_vertices = []float32{
-.5, -.5, -.5,
.5, -.5, -.5,
0.0, 0.5, -.5,
}
Так что я до сих пор возникают проблемы рисунок простой формы на экране. Я сделал несколько изменений, таких как упрощение формы (треугольник). Я создал координаты, чтобы они были ближе к оси -z, поэтому я смог бы их увидеть, но это не сработало. Затем я устанавливаю матрицу MVP (перемещая камеру назад), чтобы убедиться. Мои шейдеры просты, поскольку я передаю только вершинную позицию vec3 и матрицу MV4 mat4, поэтому верьте, что шейдеры работают правильно? Извините за всю путаницу, я думаю, что, возможно, здесь что-то не хватает.
Update: Я побежал версии команд для OpenGL:
fmt.Println(gl.GetString(gl.VERSION))
fmt.Println(gl.GetString(gl.VENDOR))
fmt.Println(gl.GetString(gl.RENDERER))
, для которых выход был:
4.5.0 NVIDIA 347,09 NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2
Не уверен, что это имеет какое-либо влияние?
Update: Я посмотрел еще несколько примеров, и решил попробовать и добавить некоторые СДЛ атрибуты, но до сих пор не повезло:
sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1)
sdl.GL_SetAttribute(sdl.GL_RED_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_GREEN_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_BLUE_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_ALPHA_SIZE, 8)
Update:
Я изменил этот пост просто включать более поздние кода, чтобы не пугать людей от TLDR.
Я не 100%, но я думаю, что это может быть рендеринг с вами внутри куба, поэтому вы не видите лица, потому что windi ng ошибочно с этой точки зрения. – LinearZoetrope
Я не уверен, что понимаю. Я использую довольно небольшие значения (1.0, 0 и т. Д.). Кажется, что куб ссылок на sdl2 работает нормально, я могу видеть все в этом примере. Единственное изменение, которое я сделал, было для шейдеров с гораздо более простыми шейдерами из ссылки tutorial2. – efel
Обратите внимание, что шейдеры во втором учебнике, которые вы связали, перемещают куб. Вы визуализируетесь так, чтобы элементы вершин находились в 1.0 или -1.0, но вы находитесь (0,0,0) - вы находитесь внутри куба. В поверхностях OpenGL ориентированы по часовой стрелке. Предположительно, ваши вершины ориентированы по часовой стрелке относительно OUTSIDE куба, поэтому вы их не видите, потому что вы просматриваете треугольники с «спины», где они невидимы. – LinearZoetrope