簡體   English   中英

直通幾何着色器

[英]Pass-through geometry shader

我剛開始使用OpenGL和Qt。 我嘗試使用幾何着色器來更改線條的寬度,但是即使是簡單的直通幾何着色器也會導致屏幕空白。

這是我的代碼(摘錄):

line_shader.addShaderFromSourceFile(QGLShader::Vertex, ":/shaders/lines.v.glsl");
line_shader.addShaderFromSourceFile(QGLShader::Fragment, ":/shaders/lines.f.glsl");
line_shader.addShaderFromSourceFile(QGLShader::Geometry, ":/shaders/lines.g.glsl");
line_shader.setGeometryInputType(GL_LINES);
line_shader.setGeometryOutputType(GL_LINES);
line_shader.setGeometryOutputVertexCount(100);
line_shader.link();
line_shader.bind();


const float data[] = {
0, 0, 0, 3,    0.8, 0, 0, 0.5,      1, 0, 0, 3,    0.8, 0, 0, 0.5,
0, 0, 0, 3,    0, 0.8, 0, 0.5,      0, 1, 0, 3,    0, 0.8, 0, 0.5,
0, 0, 0, 3,    0, 0, 0.8, 0.5,      0, 0, 1, 3,    0, 0, 0.8, 0.5,
};
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0); 


glUseProgram(line_shader.programId());

glBindBuffer(GL_ARRAY_BUFFER, vbo);

GLint a_vertex = line_shader.attributeLocation("a_vertex");
GLint a_color = line_shader.attributeLocation("a_color");
line_shader.enableAttributeArray(a_vertex);
line_shader.enableAttributeArray(a_color);

glVertexAttribPointer(a_vertex, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
glVertexAttribPointer(a_color, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(4 * sizeof(GLfloat)));

glDrawArrays(GL_LINES, 0, 6);

頂點着色器:

attribute vec4 a_vertex;
attribute vec4 a_color;
uniform mat4 u_pmv_matrix;

void main(void) {
  gl_Position = u_pmv_matrix * vec4(a_vertex.x, a_vertex.y, a_vertex.z, 1);
}

幾何着色器:

void main() {
  for (int i=0; i<gl_VerticesIn; ++i) {
    gl_Position = gl_PositionIn[i];
    EmitVertex();
  }
  EndPrimitive();
}

片段着色器:

varying vec4 v_color;

void main(void) {
  gl_FragColor = vec4(1, 0, 0, 1);
}

如果我刪除line_shader.addShaderFromSourceFile(QGLShader::Geometry, ":/shaders/lines.g.glsl"); 從代碼來看,一切都按預期進行。

我在這里做錯了什么?

編輯:我使用OS X 10.9,Qt 5.2.1。

平台上未加載/解析的擴展程序是否支持幾何着色器? 我相信它們是可選的,但是Qt嘗試加載它們( source )。

也許它們在您的實現中被命名為其他名稱。 如果您必須手動解決它們, 此KDAB文章可能會有所幫助。 這里有列出Qt知道的擴展的代碼:

// Query extensions
QList extensions = m_context->extensions().toList();
std::sort( extensions );
qDebug() << "Supported extensions (" << extensions.count() << ")";
foreach ( const QByteArray &extension, extensions )
   qDebug() << "    " << extension;

擴展名可能不是Qt所期望的。

同樣明顯,但是我想您的平台上有一個着色器工具,並且能夠運行該着色器? 我在大多數開發過程中都使用MacOSX,但不幸的是,“ OpenGL Shader Builder”工具僅支持片段和頂點着色器。 我不確定哪些工具支持幾何着色器,但我想您已經到達該着色器並以某種方式對其進行了驗證。

暫無
暫無

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

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