この OpenGL の例で三角形が描画されないのはなぜですか?

ロカトール

基本的な「画面に三角形を描く」例を機能させようとしていますが、HaskellではglおよびGLFW-bパッケージを使用しています。

私のコードはここにあります:

-- https://learnopengl.com/#!Getting-started/Hello-Triangle

-- stuff from base
import Control.Monad (when, mapM)
import Foreign -- includes Ptr and Marshal, among other things.

-- we qualify these names so we can tell what's from GLFW
import qualified Graphics.UI.GLFW as GLFW

-- gl funcs all already have "gl" in their name
import Graphics.GL

width = 800 :: Int

height = 600 :: Int

vertexShaderSource = [
    "#version 330 core\n",
    "layout (location = 0) in vec3 position;\n",
    "void main()\n",
    "{\n",
    "gl_Position = vec4(position.x, position.y, position.z, 1.0);\n",
    "}\n"]

fragmentShaderSource = [
    "#version 330 core\n",
    "out vec4 color;\n",
    "void main()\n",
    "{\n",
    "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n",
    "}\n"]

getSrcPointer :: [String] -> IO (Ptr (Ptr GLchar), Ptr GLint)
getSrcPointer sourceLines = do
    let glcharLines = map (map (fromIntegral.fromEnum)) sourceLines
    let linesLengths = map (fromIntegral.length) glcharLines
    linesPtrs <- mapM newArray glcharLines
    linesPtrsPtr <- newArray linesPtrs
    lengthsPtr <- newArray linesLengths
    return (linesPtrsPtr,lengthsPtr)

-- type KeyCallback = Window -> Key -> Int -> KeyState -> ModifierKeys -> IO ()
callback :: GLFW.KeyCallback
callback window key scanCode keyState modKeys = do
    putStrLn (show key)
    when (key == GLFW.Key'Escape && keyState == GLFW.KeyState'Pressed)
        (GLFW.setWindowShouldClose window True)

main :: IO ()
main = do
    -- init GLFW and set the appropriate options
    _ <- GLFW.init
    GLFW.windowHint (GLFW.WindowHint'ContextVersionMajor 3)
    GLFW.windowHint (GLFW.WindowHint'ContextVersionMinor 3)
    GLFW.windowHint (GLFW.WindowHint'OpenGLProfile GLFW.OpenGLProfile'Core)
    GLFW.windowHint (GLFW.WindowHint'Resizable False)
    -- create our window
    maybeWindow <- GLFW.createWindow width height "Lesson 02" Nothing Nothing
    case maybeWindow of
        Nothing -> do
            -- somehow we failed. Nothing to do but report that and quit.
            putStrLn "Failed to create a GLFW window!"
            GLFW.terminate
        Just window -> do
            -- set our context and callback
            GLFW.makeContextCurrent (Just window)
            GLFW.setKeyCallback window (Just callback)

            -- define the viewport dimensions
            (frameWidth,frameHeight) <- GLFW.getFramebufferSize window
            glViewport 0 0 (fromIntegral frameWidth) (fromIntegral frameHeight)

            -- build and compile our shader program.
            successP <- malloc

            -- vertex shader
            vertexShader <- glCreateShader GL_VERTEX_SHADER
            (linesPtrsPtr,lengthsPtr) <- getSrcPointer vertexShaderSource
            glShaderSource vertexShader 1 linesPtrsPtr lengthsPtr
            glCompileShader vertexShader
            -- check for compilation errors
            glGetShaderiv vertexShader GL_COMPILE_STATUS successP
            success <- peek successP
            when (success == 0) $ do
                putStrLn "Vertex Shader Compile Error:"
                let infoLength = 512
                resultP <- malloc
                infoLog <- mallocArray (fromIntegral infoLength)
                glGetShaderInfoLog vertexShader (fromIntegral infoLength) resultP infoLog
                result <- fromIntegral <$> peek resultP
                logBytes <- peekArray result infoLog
                putStrLn (map (toEnum.fromEnum) logBytes)

            -- fragment shader
            fragmentShader <- glCreateShader GL_FRAGMENT_SHADER
            (linesPtrsPtr,lengthsPtr) <- getSrcPointer fragmentShaderSource
            glShaderSource fragmentShader 1 linesPtrsPtr lengthsPtr
            glCompileShader fragmentShader
            -- check for compilation errors
            glGetShaderiv fragmentShader GL_COMPILE_STATUS successP
            success <- peek successP
            when (success == 0) $ do
                putStrLn "Fragment Shader Compile Error:"
                let infoLength = 512
                resultP <- malloc
                infoLog <- mallocArray (fromIntegral infoLength)
                glGetShaderInfoLog fragmentShader (fromIntegral infoLength) resultP infoLog
                result <- fromIntegral <$> peek resultP
                logBytes <- peekArray result infoLog
                putStrLn (map (toEnum.fromEnum) logBytes)

            -- link up the shaders
            shaderProgram <- glCreateProgram
            glAttachShader shaderProgram vertexShader
            glAttachShader shaderProgram fragmentShader
            glLinkProgram shaderProgram
            -- check for linking errors
            glGetProgramiv shaderProgram GL_LINK_STATUS successP
            success <- peek successP
            when (success == 0) $ do
                putStrLn "Program Linking Error:"
                let infoLength = 512
                resultP <- malloc
                infoLog <- mallocArray (fromIntegral infoLength)
                glGetProgramInfoLog shaderProgram (fromIntegral infoLength) resultP infoLog
                result <- fromIntegral <$> peek resultP
                logBytes <- peekArray result infoLog
                putStrLn (map (toEnum.fromEnum) logBytes)

            -- cleanup the sub-programs now that our complete shader program is ready
            glDeleteShader vertexShader
            glDeleteShader fragmentShader

            -- setup vertex data and attribute pointers
            verticesP <- newArray ([
                -0.5, -0.5, 0.0, -- Left  
                0.5, -0.5, 0.0, -- Right 
                0.0,  0.5, 0.0  -- Top
                ] :: [GLfloat])
            let verticesSize = fromIntegral $ sizeOf (0.0 :: GLfloat) * 9
            vboP <- malloc :: IO (Ptr GLuint)
            vaoP <- malloc :: IO (Ptr GLuint)
            glGenVertexArrays 1 vaoP
            glGenBuffers 1 vboP
            -- Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).
            vao <- peek vaoP
            glBindVertexArray vao
            vbo <- peek vboP
            glBindBuffer GL_ARRAY_BUFFER vbo
            glBufferData GL_ARRAY_BUFFER verticesSize (castPtr verticesP) GL_STATIC_DRAW
            let threeFloats = fromIntegral $ sizeOf (0.0::GLfloat) * 3
            glVertexAttribPointer 0 3 GL_FLOAT GL_FALSE threeFloats nullPtr
            glEnableVertexAttribArray 0
            -- Note that this is allowed, the call to glVertexAttribPointer
            -- registered VBO as the currently bound vertex buffer object so
            -- afterwards we can safely unbind
            glBindBuffer GL_ARRAY_BUFFER 0
            -- Unbind VAO (it's always a good thing to unbind any buffer/array
            -- to prevent strange bugs)
            glBindVertexArray 0

            -- "game loop"
            let loop :: IO ()
                loop = do
                    shouldClose <- GLFW.windowShouldClose window
                    if shouldClose
                        then return ()
                        else do
                            -- event poll
                            GLFW.pollEvents

                            -- clear the screen
                            glClearColor 0.2 0.3 0.3 1.0
                            glClear GL_COLOR_BUFFER_BIT
                            -- draw a triangle
                            glUseProgram shaderProgram
                            glBindVertexArray vao
                            glDrawArrays GL_TRIANGLES 0 3
                            glBindVertexArray 0

                            -- swap buffers and go again
                            GLFW.swapBuffers window
                            loop
            loop

            -- clean up the gl resources
            glDeleteVertexArrays 1 vaoP
            glDeleteBuffers 1 vboP
            -- clean up the GLFW resources
            GLFW.terminate

エラーが報告されることなくコンパイルおよび実行されますが、表示されるのは透明な色だけです。三角形はまったく描かれていません。

カー・バー

プログラムをコンパイルして実行すると、シェーダー コンパイル エラーとプログラム リンク エラーが発生することに注意してください。具体的には、次のエラーが発生します。

Vertex Shader Compile Error:
0:1(18): error: syntax error, unexpected $end

Fragment Shader Compile Error:
0:1(18): error: syntax error, unexpected $end

もちろん、リンク エラーもあります。

詳しく調べglShaderSourceてみると、あなたの通話には欠陥があります。それらはシェーダーごとに 6 ラインのライン ポインターとライン長の配列を渡していますが、ライン カウント引数は1です。の最終行を変更しgetSrcPointerて行数を返す場合:

return (linesPtrsPtr,lengthsPtr, (fromIntegral.length) linesLengths)

そして、このカウントをglShaderSourceそれぞれの場合の呼び出しに渡します:

(linesPtrsPtr,lengthsPtr,count) <- getSrcPointer vertexShaderSource
glShaderSource vertexShader count linesPtrsPtr lengthsPtr
...
(linesPtrsPtr,lengthsPtr,count) <- getSrcPointer fragmentShaderSource
glShaderSource fragmentShader count linesPtrsPtr lengthsPtr

その後、プログラムは正常に動作します。

ハッピートライアングル!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

このOpenGLプログラムはなぜ三角形を描かないのですか?

分類Dev

OpenGLコアプロファイルのウィンドウに赤い三角形が表示されないのはなぜですか?

分類Dev

OpenGL(3)の三角形がlwjglを使用してレンダリングされないのはなぜですか?

分類Dev

テッセレーション後に三角形が表示されないのはなぜですか?OpenGL

分類Dev

openglとGLFW3の単純な三角形の描画、三角形が見えない

分類Dev

OpenGL描画三角形が表示されない+ glClearColorが画面の色を設定しない

分類Dev

三角形が表示されないのはなぜですか?

分類Dev

OpenGL を使用した基本的な三角形の描画

分類Dev

OpenGL:指定された三角形の予期しない頂点位置

分類Dev

OpenGLはいくつかの三角形を描くことができません

分類Dev

OpenGLはいくつかの三角形を描くことができません

分類Dev

頂点シェーダーのOpenGlで宣言されていない識別子、頂点シェーダーで三角形を描画するのに問題があります

分類Dev

OpenGL ESでそれぞれ異なる変換行列を持つ複数の三角形を描画するにはどうすればよいですか?

分類Dev

C ++でのOpenGL基本三角形レンダリングが機能しない

分類Dev

OpenGL描画三角形は白のみ

分類Dev

Openglの三角形は描かれていません

分類Dev

C ++で三角形の外側にポイントが生成されるのはなぜですか?

分類Dev

C ++ Openglの三角形が描画されているか、まったく表示されていません

分類Dev

三角形の半分が画面に表示されるのはなぜですか?

分類Dev

Openglの頂点の色は常に黒い三角形になります

分類Dev

OpenGL付きの基本的なLWJGL三角形

分類Dev

OpenGLで通常のグリッドの補完的な三角形を動的に作成します

分類Dev

OpenGLで複数の三角形を描く

分類Dev

opengl es、glslでの三角形交差テスト

分類Dev

PyQt5とOpenGLを使用して三角形を描画する(Qt C ++の例を書き直す)

分類Dev

最新のOpenGLとPythonで三角形を回転させる方法

分類Dev

CSS三角形のjQueryanimate()の色が変更されました-なぜこれが機能しないのですか?

分類Dev

OpenGLで半透明の三角形を並べ替える方法は?

分類Dev

OpenGL C ++で複数の三角形を描く方法は?

Related 関連記事

  1. 1

    このOpenGLプログラムはなぜ三角形を描かないのですか?

  2. 2

    OpenGLコアプロファイルのウィンドウに赤い三角形が表示されないのはなぜですか?

  3. 3

    OpenGL(3)の三角形がlwjglを使用してレンダリングされないのはなぜですか?

  4. 4

    テッセレーション後に三角形が表示されないのはなぜですか?OpenGL

  5. 5

    openglとGLFW3の単純な三角形の描画、三角形が見えない

  6. 6

    OpenGL描画三角形が表示されない+ glClearColorが画面の色を設定しない

  7. 7

    三角形が表示されないのはなぜですか?

  8. 8

    OpenGL を使用した基本的な三角形の描画

  9. 9

    OpenGL:指定された三角形の予期しない頂点位置

  10. 10

    OpenGLはいくつかの三角形を描くことができません

  11. 11

    OpenGLはいくつかの三角形を描くことができません

  12. 12

    頂点シェーダーのOpenGlで宣言されていない識別子、頂点シェーダーで三角形を描画するのに問題があります

  13. 13

    OpenGL ESでそれぞれ異なる変換行列を持つ複数の三角形を描画するにはどうすればよいですか?

  14. 14

    C ++でのOpenGL基本三角形レンダリングが機能しない

  15. 15

    OpenGL描画三角形は白のみ

  16. 16

    Openglの三角形は描かれていません

  17. 17

    C ++で三角形の外側にポイントが生成されるのはなぜですか?

  18. 18

    C ++ Openglの三角形が描画されているか、まったく表示されていません

  19. 19

    三角形の半分が画面に表示されるのはなぜですか?

  20. 20

    Openglの頂点の色は常に黒い三角形になります

  21. 21

    OpenGL付きの基本的なLWJGL三角形

  22. 22

    OpenGLで通常のグリッドの補完的な三角形を動的に作成します

  23. 23

    OpenGLで複数の三角形を描く

  24. 24

    opengl es、glslでの三角形交差テスト

  25. 25

    PyQt5とOpenGLを使用して三角形を描画する(Qt C ++の例を書き直す)

  26. 26

    最新のOpenGLとPythonで三角形を回転させる方法

  27. 27

    CSS三角形のjQueryanimate()の色が変更されました-なぜこれが機能しないのですか?

  28. 28

    OpenGLで半透明の三角形を並べ替える方法は?

  29. 29

    OpenGL C ++で複数の三角形を描く方法は?

ホットタグ

アーカイブ