簡體   English   中英

GLSL Shader不渲染任何東西,VAO填充,VBO填充頂點

[英]GLSL Shader not rendering anything, VAO is filled, VBO filled with vertices

我已經用頂點(2x位置,2x大小,4x uv,2x紋理數據(1個float設置了正確的紋理數組,並設置了2個數組中的紋理索引))填充了VBO,仍然沒有渲染,我還缺少什么?

我嘗試設置幾何着色器以渲染簡單的四邊形,什么都沒有顯示,我只嘗試渲染片段中的顏色,什么都沒有顯示,我檢查了OPENGL調試消息,那里什么都沒有,在頂點着色器中我檢查了矩陣的計算,一切都應該很好

使用glBufferData每幀將數據加載到同一緩沖區,由於調整大小,此代碼用於實體,並且它們在屏幕上的數量可以輕松更改。

片段着色器:

void main()
{
    texColor = vec4(1.0,0.0,0.0,1.0); //Red fillment
    FragColor = texColor;
}

頂點着色器:

布局:

layout(location = 0) in vec2 position;
layout(location = 1) in vec2 size;
layout(location = 2) in vec4 uv;
layout(location = 3) in vec2 textureData; //1. data is to pick correct atlas, 2. is index of texture in atlas

接口:

out VS_OUT
{
    mat4 screenMatrix;
    vec2 position;
    vec4 uv;
    vec2 textureData;
    vec2 size;
} vs_out;

矩陣:

mat4 screenMatrix = mat4((2.0/screenRatio.x),0.0,0.0,0.0,0.0,(2.0/screenRatio.y),0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);

幾何着色器:

布局:

layout (points) in;
layout(triangle_strip,max_vertices = 4) out;

出:

out vec2 TexData;
out vec2 TexCoord;

碼:

void renderPlayer(mat4 screenMatrix, vec4 position,vec2 textureData,vec2 size,vec4 uv)
{
    gl_Position = nullPos+((position+vec4(0.0,0.0,0.0,0.0))*screenMatrix); // 1:bottom-left
    TexData = textureData;
    TexCoord = vec2(uv.xy);
    EmitVertex();
    gl_Position = nullPos+((position+vec4(size.x,0.0,0.0,0.0))*screenMatrix); // 2:bottom-right
    TexData = textureData;
    TexCoord = vec2(uv.zy);
    EmitVertex();
    gl_Position = nullPos+((position+vec4(0.0,size.y,0.0,0.0))*screenMatrix); // 3:top-left
    TexData = textureData;
    TexCoord = vec2(uv.xw);
    EmitVertex();
    gl_Position = nullPos+((position+vec4(size.x,size.y,0.0,0.0))*screenMatrix);  // 4:top-right 
    TexData = textureData;
    TexCoord = vec2(uv.zw);
    EmitVertex();
    EndPrimitive();
}

主要:

void main() {    
    renderPlayer(gs_in[0].screenMatrix,vec4(gs_in[0].position,0.0,0.0),gs_in[0].textureData,gs_in[0].size,gs_in[0].uv);
}  

C ++代碼:

VBO數據初始化:

float* vertices = new float[totalVertices];
    for (EntityRenderData renderDataCurrent : renderData)
    {
        for (int layerI = 0; layerI < renderDataCurrent.getLayerCount(); layerI++)
        {
            int i = 0;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).xPos;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).yPos;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).xSize;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).ySize;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).U0;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).V0;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).U1;
            vertices[layerI * 10 + i++] = renderDataCurrent.getLayer(layerI).V1;
            vertices[layerI * 10 + i++] = (float)renderDataCurrent.getLayer(layerI).textureAtlasId;
            vertices[layerI * 10 + i++] = (float)renderDataCurrent.getLayer(layerI).textureIndex;
            drawCount++;
        }
    }

渲染部分:

    glBindVertexArray(playerVAO);
    glBindBuffer(GL_ARRAY_BUFFER, playerVBO);
    glBufferData(GL_ARRAY_BUFFER, totalVertices * sizeof(float), vertices, GL_STREAM_DRAW);
    game->renderer->entityShader->use();
    glDrawArrays(GL_POINTS, 0, drawCount);

初始化部分:

glGenVertexArrays(1, &playerVAO);
    glGenBuffers(1, &playerVBO);

    glBindVertexArray(playerVAO);
    // position
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    // size
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)(2 * sizeof(float)));
    glEnableVertexAttribArray(1);
    // uv
    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)(4 * sizeof(float)));
glEnableVertexAttribArray(2);
    // texture data
    glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)(8 * sizeof(float)));
    glEnableVertexAttribArray(3);

如果綁定了一個非零命名數組緩沖區對象,則glVertexAttribPointer的最后一個參數將被視為緩沖區對象數據存儲區中的字節偏移量。 通用頂點屬性數據和引用緩沖區的定義在“ 頂點數組對象”中說明

使用glVertexAttribPointer時,生成緩沖區對象是不夠的,數組緩沖區對象必須是當前綁定的緩沖區對象:

glGenVertexArrays(1, &playerVAO);
glGenBuffers(1, &playerVBO);

glBindVertexArray(playerVAO);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);

glBindBuffer(GL_ARRAY_BUFFER, playerVBO); // <--- bind the buffer object

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)(2 * sizeof(float)));
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)(4 * sizeof(float)));
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 10 * sizeof(float), (void*)(8 * sizeof(float)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM