我正在尝试从顶点缓冲区对象渲染一些数据。然而很少使用glutil和raw。 当程序运行时,它会陷入无限循环,我会得到你在下面看到的错误。
顶点着色器
#version 150 core
in vec4 position;
void main (void)
{
gl_Position = position;
}
片段着色器
#version 150 core
out vec4 color;
void main (void)
{
color = vec4(0.0, 0.8, 1.0, 1.0);
}
我尝试过使用430但是没有用。所以我尝试使用150,因为我看到很多人使用它。此外,我尝试在使用原始时使用 layout ,但这不起作用。
使用实例
mesh :: [GLfloat]
mesh = [ 0.25, -0.25, 0.5
,-0.25, -0.25, 0.5
, 0.25, 0.25, 0.5]
preMainLoop :: G.Window -> IO ()
preMainLoop window = do
p <- loadShaderProgram [ ( VertexShader, "frag.fs")
, ( FragmentShader, "vert.vs")]
myVBO <- makeBuffer ArrayBuffer mesh
vao <- makeVAO $ let vad = VertexArrayDescriptor 3 Float stride offset0"
in do
printErrorMsg "something else"
currentProgram $= Just (program p)
printErrorMsg "program"
bindBuffer ArrayBuffer $= Just myVBO
printErrorMsg "buffer"
enableAttrib p "position"
printErrorMsg "attribLocation"
setAttrib p "position" ToFloat vad
bindBuffer ArrayBuffer $= Nothing
mainLoop window vao p
错误
program
WARNING: attrib position is not active
GL: Error InvalidOperation "invalid operation"
答案 0 :(得分:1)
所以我尝试用opengl raw测试我的代码,这导致它产生我想要的结果。
loc <- withCString "position" $ \pos -> glGetAttribLocation p pos
bindBuffer ArrayBuffer $= Just buffer
glEnableVertexAttribArray (fromIntegral loc)
glVertexAttribPointer (fromIntegral loc) 3 gl_FLOAT (fromIntegral gl_FALSE) 8 nl