Текстура Haskell opengl только среднего цвета

Вместо рендеринга полной текстуры он просто рендерит средний цвет. Ошибок opengl или других ошибок нет. Я проверяю ошибки шейдера, но ошибок не было.

import qualified Graphics.UI.GLFW as G
import Graphics.Rendering.OpenGL.GL
import Control.Applicative
import System.Exit
import System.IO
import Control.Monad (unless, when)
import Graphics.GLUtil
import Foreign.Storable

main :: IO ()
main = do
    let errorCallback err description = hPutStrLn stderr description
    G.setErrorCallback (Just errorCallback)
    successfulInit <- G.init
    if not successfulInit
        then exitFailure
        else do
          mw <- G.createWindow 1000 700 "Simple example, haskell style" Nothing Nothing
          case mw of Nothing -> (G.terminate >> exitFailure)
                     Just window -> do
                                    G.makeContextCurrent mw
                                    preMainLoop window
                                    G.destroyWindow window
                                    G.terminate
                                    exitSuccess

loadTex :: FilePath -> IO TextureObject
loadTex f = do t <- either error id <$> readTexture f
               textureFilter Texture2D $= ((Linear', Nothing), Linear')
               texture2DWrap $= (Repeated, Repeat)
               return t

mesh :: [GLfloat]
mesh =  [  0.0,  0.5, 0, 1, 0.0, 0.5,
          -0.5, -0.5, 0, 1, 0.0, 1.0,
           0.5, -0.5, 0, 1, 1.0, 1.0]

preMainLoop window = do
    clearColor $= Color4 0.2 0.1243 0.5 1.0
    blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
    p <- loadShaderProgram [(VertexShader, "vert4.vs"), (FragmentShader, "frag4.fs")]
    currentProgram $= Just (program p)
    printErrorMsg "program"
    vao <- makeVAO $ 
        let meshVad  = VertexArrayDescriptor 4 Float (stride 6) offset0
            texCoord = VertexArrayDescriptor 2 Float (stride 6) (offsetPtr 3)
            stride n = fromIntegral $ sizeOf (undefined::GLfloat) * n
            mPos     = getAttrib p "position"
            tc       = getAttrib p "tc"
        in do
            buffer <- makeBuffer ArrayBuffer mesh
            vertexAttribArray mPos $= Enabled
            vertexAttribPointer mPos $= (ToFloat, meshVad)

            vertexAttribArray tc $= Enabled
            vertexAttribPointer tc $= (ToFloat, texCoord)
    tex <- loadTex "fail texture.png"
    textureBinding Texture2D $= Nothing
    activeTexture $= TextureUnit 0
    textureBinding Texture2D $= Just tex
    setUniform p "tex" (TextureUnit 0)
    mainLoop window vao p

mainLoop window vao p = do
    action <- (G.windowShouldClose window)
    unless action $ do
        (width, height) <- G.getFramebufferSize window
        viewport $= (Position 0 0, Size (fromIntegral width) (fromIntegral height))
        printErrorMsg "start of loop"
        Just t <- G.getTime
        clear [ColorBuffer, DepthBuffer]
        withVAO vao $ drawArrays Triangles 0 3
        G.swapBuffers window
        G.pollEvents
        mainLoop window vao p

фрагментный шейдер

#version 430 core
uniform sampler2D tex;

in VS_OUT
{
    vec2 tc;
} fs_in;

out vec4 color;

void main (void)
{
    color = texture(tex, fs_in.tc);
}

вершинный шейдер

#version 430 core

in vec4 position;
in vec2 tc;

out VS_OUT
{
    vec2 tc;
} vs_out;

void main (void)
{
    gl_Position = position;
    vs_out.tc = tc;
}

person JoelWaterworth    schedule 09.06.2014    source источник
comment
Где ваш фактический код рисования? Также, где определены nx и nl? Кроме того, почему эти короткие, ничего не говорящие имена? Это хороший стиль, особенно для Haskell, делать вещи простыми для понимания и давать вещам правильные имена.   -  person datenwolf    schedule 09.06.2014
comment
Это скорее всего не ваша основная проблема, но вы ставите WRAP_S дважды. Вероятно, вы хотели использовать WRAP_T для второго. Я думаю, что у вас нет действительных координат текстуры в вашем буфере или что-то не так со значениями nx/nl, о которых спрашивает @datenwolf.   -  person Reto Koradi    schedule 09.06.2014
comment
Как вы можете иметь неверные координаты текстуры и при этом не иметь ошибок?   -  person JoelWaterworth    schedule 09.06.2014


Ответы (1)


Проблема заключалась в смещении, поскольку оно не учитывало размер GLfloat. Заставляет opengl использовать отрицательные значения.

person JoelWaterworth    schedule 14.06.2014