簡體   English   中英

GLSL OpenGL多邊形無法渲染

[英]GLSL OpenGL Polygons not rendering

我正在嘗試使用OpenGL着色器繪制一個簡單的三角形。 我試圖將代碼分成一個總體渲染類中的單獨方法,但是,似乎無法在屏幕上渲染三角形。 這是我的compileShaders()方法,用於編譯和加載我的着色器源代碼:

static const GLchar* vertexShaderSource[] = {
    "#version 430 core                          \n"
    "in vec4 vPosition;                         \n"
    "in vec4 vColor;                            \n"
    "out vec4 color;                            \n"
    "                                           \n"
    "void main() {                              \n"
    "   color = vColor;                         \n"
    "   gl_Position = vPosition;                \n"
    "}                                          \n"
};

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, vertexShaderSource, NULL);
glCompileShader(vertexShader);

program = glCreateProgram();
glAttachShader(program, vertexShader);
glLinkProgram(program);

glDeleteShader(vertexShader);

return program;

在另一種方法中,我調用glewInit(),compileShaders(),然后設置頂點數組和頂點緩沖區對象。 在此方法中,triangleVertices []和triangleColors []是兩個數組,分別包含三角形每個頂點的位置(x,y,z)和顏色值(r,g,b,a)。

glewInit();
renderingProgram = compileShaders();

glEnable(GL_ARRAY_BUFFER);
glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);

glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, numberOfVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

glBufferSubData(GL_ARRAY_BUFFER, 0, numberOfVertices*3*sizeof(GLfloat), triangleVertices);
glBufferSubData(GL_ARRAY_BUFFER, numberOfVertices*3*sizeof(GLfloat), numberOfVertices*4*sizeof(GLfloat), triangleColors);

GLuint vpos = glGetAttribLocation(renderingProgram, "vPosition"); 
glVertexAttribPointer(vpos, 3, GL_FLOAT, GL_FALSE, 0, 0); 

GLuint cpos = glGetAttribLocation(renderingProgram, "vColor");
glVertexAttribPointer(cpos, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numberOfVertices*3*sizeof(GLfloat)));   

glUseProgram(renderingProgram);
glEnableVertexAttribArray(vpos);
glEnableVertexAttribArray(cpos);

最后是我的render()方法,在其中嘗試繪制加載到數組緩沖區的Triangle:

const GLfloat color[] = {0.0f, 0.0f, 1.0f, 1.0f};
glClearBufferfv(GL_COLOR, 0, color);

glUseProgram(renderingProgram);

glDrawArrays(GL_TRIANGLES, 0, 3);
SwapBuffers(hDC_);

我正在渲染一個Win32窗口,該窗口在另一個類中設置。 渲染后,我可以看到一個藍屏,因此看起來好像glClearBufferfv調用正常工作。 但是我的三角形無處可尋。 如果將渲染模式更改為glDrawArrays(GL_POINTS, 0, 1)我會在屏幕中間看到一個白色像素。

我究竟做錯了什么?

正如其他人指出的那樣,您也需要一個片段着色器,例如,

#version 430

in vec4 color;
out vec4 frag_rgba; // default index (0) (glFragBindDataLocation)

void main (void) {
    frag_rgba = color;
}

鏈接之前,將此着色器與頂點着色器一起附加到程序中。 鏈接后,可以從程序中分離着色器。 您也可以考慮在頂點着色器中使用顯式屬性索引

暫無
暫無

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

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