- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试编写一个采用单个 vec4 位置并创建三角形的几何着色器。该程序链接正确,但是当绘制调用发生时,屏幕上没有显示任何内容。
我有一个工作版本,在我自己计算三角形后将顶点提供给 OpenGL,但我希望让着色器工作,以便可以在 gpu 上创建三角形(以及最终其他形状)反而。这是我的代码:
void TriSprite::v_InitShader(void)
{
if(_shaderProgram != NULL) return;
//=====Vertex Shaders=====
//This is used when only colors, not textures are used to render
//a pirmitive
static const GLchar* _vertexShaderSource[] =
{
"#version 430 core \n"
" \n"
"layout (location = 0) in vec4 position; \n"
"layout (location = 1) in vec4 color; \n"
"layout (location = 2) in float width; \n"
"layout (location = 3) in float height; \n"
"uniform mat4 transform_mat; \n"
" \n"
"out vec4 vs_color; \n"
"out vec4 vs_dimnsions; \n"
" \n"
"void main(void) \n"
"{ \n"
//=====Top=====
" gl_Position = transform_mat * position; \n"
" vs_color = color; \n"
" vs_dimnsions = vec4(width, height, 0.0, 0.0); \n"
"} \n"
};
//=====Geomtry Shader=====
static const GLchar* _geometryShaderSource[] =
{
"#version 430 core \n"
" \n"
"layout(points) in; \n"
"layout(triangle_strip, max_vertices = 2) out; \n"
" \n"
"in vec4 vs_color[1]; \n"
"in vec4 vs_dimnsions[1]; \n"
" \n"
"out vec4 gs_color; \n"
" \n"
"void main() \n"
"{ \n"
//Bottom Right
" gl_Position = gl_in[0].gl_Position + vec4(vs_dimnsions[0].x, -vs_dimnsions[0].y, 0, 0); \n"
" EmitVertex(); \n"
//Top
" gl_Position = gl_in[0].gl_Position + vec4(0.0, vs_dimnsions[0].y, 0.0, 0.0); \n"
" EmitVertex(); \n"
//Bottom Left
" gl_Position = gl_in[0].gl_Position + vec4(-vs_dimnsions[0].x, -vs_dimnsions[0].y, 0.0, 0.0); \n"
" EmitVertex(); \n"
" \n"
" EndPrimitive(); \n"
" gs_color = vs_color[0]; \n"
"} \n"
};
//=====Fragment Shaders=====
//This is used when only colors, not textures are used to render
//a pirmitive
static const GLchar* _fragmentShaderSource[] =
{
"#version 430 core \n"
" \n"
"in vec4 gs_color; \n"
"out vec4 color; \n"
" \n"
"void main(void) \n"
"{ \n"
" color = gs_color; \n"
"} \n"
};
//=====Compile Shaders=====
GLuint vertextShaderProgram;
GLuint geometryShaderProgram;
GLuint fragmentShaderProgram;
vertextShaderProgram = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertextShaderProgram, 1, _vertexShaderSource, NULL);
glCompileShader(vertextShaderProgram);
geometryShaderProgram = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geometryShaderProgram, 1, _geometryShaderSource, NULL);
glCompileShader(geometryShaderProgram);
fragmentShaderProgram = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderProgram, 1, _fragmentShaderSource, NULL);
glCompileShader(fragmentShaderProgram);
_shaderProgram = glCreateProgram();
glAttachShader(_shaderProgram, vertextShaderProgram);
glAttachShader(_shaderProgram, geometryShaderProgram);
glAttachShader(_shaderProgram, fragmentShaderProgram);
glLinkProgram(_shaderProgram);
GLint isLinked = 0;
glGetProgramiv(_shaderProgram, GL_LINK_STATUS, &isLinked);
//=====Error Checking=====
if(isLinked == GL_FALSE)
{
GLint maxLength = 0;
glGetProgramiv(_shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);
//The maxLength includes the NULL character
std::vector<GLchar> infoLog(maxLength);
glGetProgramInfoLog(_shaderProgram, maxLength, &maxLength, &infoLog[0]);
for(auto i = infoLog.begin(); i != infoLog.end(); ++i)
{
std::cout << *i ;
}
std::cout << "\n";
//The program is useless now. So delete it.
glDeleteProgram(_shaderProgram);
}
//=====Clean up=====
glDeleteShader(vertextShaderProgram);
glDeleteShader(geometryShaderProgram);
glDeleteShader(vertextShaderProgram);
}
渲染调用:
void Renderer::AddToBatch(GLuint shader, Vec2& pos, U32 w, U32 h, Col& c)
{
if(_currentShader != shader)
{
Draw();
_currentShader = shader;
glUseProgram(_currentShader);
}
if(_currentBatchSize + 1 >= _maxBatchSize) { Draw(); }
_vertices.push_back(pos.GetX());
_vertices.push_back(pos.GetY());
_vertices.push_back(pos.GetZ());
_vertices.push_back(pos.GetW());
_xDimensions.push_back((F32)w);
_yDimensions.push_back((F32)h);
_colors.push_back(c.GetRed());
_colors.push_back(c.GetGreen());
_colors.push_back(c.GetBlue());
_colors.push_back(c.GetAlpha());
++_currentBatchSize;
}
void Renderer::Draw(void)
{
if(_currentBatchSize == 0) return;
GLuint buffers[4];
glGenBuffers(4, buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(F32) * _vertices.size()), &_vertices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(F32) * _colors.size()), &_colors[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[2]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(U32) * _xDimensions.size()), &_xDimensions[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[3]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(U32) * _yDimensions.size()), &_yDimensions[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 1, GL_FLOAT, GL_FALSE, 0, NULL);
glDrawArrays(GL_TRIANGLES, 0, _currentBatchSize);
_currentBatchSize = 0;
}
任何见解或帮助将不胜感激。
static const GLchar* _vertexShaderSource[] =
{
"#version 430 core \n"
" \n"
"layout (location = 0) in vec4 position; \n"
"layout (location = 1) in vec4 color; \n"
"uniform mat4 transform_mat; \n"
" \n"
"out vec4 vs_color; \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = transform_mat * position; \n"
" vs_color = color; \n"
"} \n"
};
static const GLchar* _fragmentShaderSource[] =
{
"#version 430 core \n"
" \n"
"in vec4 vs_color; \n"
"out vec4 color; \n"
" \n"
"void main(void) \n"
"{ \n"
" color = vs_color; \n"
"} \n"
};
您会注意到,在这个示例中,我直接将顶点提供给着色器,基本上只是对它们进行变换。这个版本有效。这是基于评论的更新版本。这仍然不起作用:
static const GLchar* _vertexShaderSource[] =
{
"#version 430 core \n"
" \n"
"layout (location = 0) in vec4 position; \n"
"layout (location = 1) in vec4 color; \n"
"layout (location = 2) in float width; \n"
"layout (location = 3) in float height; \n"
"uniform mat4 transform_mat; \n"
" \n"
"out vec4 vs_color; \n"
"out vec4 vs_dimensions; \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = transform_mat * position; \n"
" vs_color = color; \n"
" vs_dimensions = transform_mat * vec4(width, height, 0.0, 0.0); \n"
"} \n"
};
static const GLchar* _geometryShaderSource[] =
{
"#version 430 core \n"
" \n"
"layout(points) in; \n"
"layout(triangle_strip, max_vertices = 3) out; \n"
" \n"
"in vec4 vs_color[1]; \n"
"in vec4 vs_dimensions[1]; \n"
" \n"
"out vec4 gs_color; \n"
" \n"
"void main() \n"
"{ \n"
" gs_color = vs_color[0]; \n"
//Top
" gl_Position = gl_in[0].gl_Position + vec4(0.0, vs_dimensions[0].y, 0.0, 0.0); \n"
" EmitVertex(); \n"
//Bottom Right
" gl_Position = gl_in[0].gl_Position + vec4(vs_dimensions[0].x, -vs_dimensions[0].y, 0, 0); \n"
" EmitVertex(); \n"
//Bottom Left
" gl_Position = gl_in[0].gl_Position + vec4(-vs_dimensions[0].x, -vs_dimensions[0].y, 0.0, 0.0); \n"
" EmitVertex(); \n"
" \n"
" EndPrimitive(); \n"
"}
static const GLchar* _fragmentShaderSource[] =
{
"#version 430 core \n"
" \n"
"in vec4 gs_color; \n"
"out vec4 color; \n"
" \n"
"void main(void) \n"
"{ \n"
" color = gs_color; \n"
"} \n"
};
void Renderer::Draw(void)
{
if(_currentBatchSize == 0) return;
GLuint buffers[4];
glGenBuffers(4, buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(F32) * _vertices.size()), &_vertices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(F32) * _colors.size()), &_colors[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[2]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(U32) * _xDimensions.size()), &_xDimensions[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[3]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(U32) * _yDimensions.size()), &_yDimensions[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 1, GL_FLOAT, GL_FALSE, 0, NULL);
glDrawArrays(GL_TRIANGLES, 0, _currentBatchSize);
_currentBatchSize = 0;
}
最佳答案
在单步执行代码并花一些时间检查进出几何着色器的内容后,我发现了我的问题。这是语法错误、普遍缺乏理解和一些逻辑错误的结合。这是所有有效的最终代码:
static const GLchar* _vertexShaderSource[] =
{
"#version 430 core \n"
"layout (location = 0) in vec4 position; \n"
"layout (location = 1) in vec4 color; \n"
"layout (location = 2) in vec2 dimensions; \n"
"uniform mat4 transform_mat; \n"
"out vec4 gs_color; \n"
"out vec4 gs_dimensions; \n"
"void main(void) \n"
"{ \n"
" gl_Position = transform_mat * position; \n"
" gs_color = color; \n"
" gs_dimensions = transform_mat * vec4(dimensions.x, dimensions.y, 0.0, 0.0); \n"
"} \n"
};
//=====Geomtry Shader=====
static const GLchar* _geometryShaderSource[] =
{
"#version 430 core \n"
"layout(points) in; \n"
"layout(triangle_strip, max_vertices = 3) out; \n"
"in vec4 gs_color[]; \n"
"in vec4 gs_dimensions[]; \n"
"out vec4 fs_color; \n"
"void main() \n"
"{ \n"
" fs_color = gs_color[0]; \n"
//Top
" gl_Position = gl_in[0].gl_Position + vec4(0.0, gs_dimensions[0].y, 0.0, 0.0); \n"
" EmitVertex(); \n"
//Bottom Right
" gl_Position = gl_in[0].gl_Position + vec4(-gs_dimensions[0].x, -gs_dimensions[0].y, 0, 0); \n"
" EmitVertex(); \n"
//Bottom Left
" gl_Position = gl_in[0].gl_Position + vec4(gs_dimensions[0].x, -gs_dimensions[0].y, 0.0, 0.0); \n"
" EmitVertex(); \n"
" EndPrimitive(); \n"
"} \n"
};
//=====Fragment Shaders=====
//This is used when only colors, not textures are used to render
//a pirmitive
static const GLchar* _fragmentShaderSource[] =
{
"#version 430 core \n"
"in vec4 fs_color; \n"
"out vec4 color; \n"
"void main(void) \n"
"{ \n"
" color = fs_color; \n"
"} \n"
};
下面是 draw 和 AddToBatch 函数的样子:
void Renderer::AddToBatch(GLuint shader, Vec2& pos, U32 w, U32 h, Col& c)
{
if(_currentShader != shader)
{
Draw();
_currentShader = shader;
glUseProgram(_currentShader);
_SetOrthoProjection();
}
if(_currentBatchSize + 1 >= _maxBatchSize) { Draw(); }
_vertices.push_back(pos.GetX());
_vertices.push_back(pos.GetY());
_vertices.push_back(pos.GetZ());
_vertices.push_back(pos.GetW());
_dimensions.push_back((F32)w);
_dimensions.push_back((F32)h);
_colors.push_back(c.GetRed());
_colors.push_back(c.GetGreen());
_colors.push_back(c.GetBlue());
_colors.push_back(c.GetAlpha());
++_currentBatchSize;
}
void Renderer::Draw(void)
{
if(_currentBatchSize == 0) return;
GLuint buffers[4];
glGenBuffers(4, buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(F32) * _vertices.size()), &_vertices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(F32) * _colors.size()), &_colors[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, buffers[2]);
glBufferData(GL_ARRAY_BUFFER, (sizeof(F32) * _dimensions.size()), &_dimensions[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glDrawArrays(GL_POINTS, 0, _currentBatchSize);
//=====Reset All Containers and Counters=====
_vertices.clear();
_dimensions.clear();
_colors.clear();
_uvs.clear();
_currentBatchSize = 0;
}
关于c++ - OpenGL 几何着色器三角形不会绘制没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41689699/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!