我在Youtube上使用OpenGl 3和BennyBox的教程.
使用此方法:
static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string& errorMessage){
GLint success = 0;
GLchar error [1024] = {0};
if(isProgram){
glGetProgramiv(shader, flag, &success);
}else{
glGetShaderiv(shader, flag, &success);
}
if(success == GL_FALSE){
if(isProgram){
glGetProgramInfoLog(shader, sizeof(error), NULL, error);
}else{
glGetShaderInfoLog(shader,sizeof(error), NULL, error);
}
std::cerr<< errorMessage<< ": " << error<< "'"<<std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我应该能够加载着色器文件(片段和顶点着色器).它适用于基本着色器,但是当我尝试将它们修改为该点时:
#version 120
attribute vec3 position;
attribute vec2 texCoord;
varying vec2 texCoord;
void main(){
gl_Position = vec4(position, 1.0);
texCoord0 = texCoord;
}
Run Code Online (Sandbox Code Playgroud)
我得到:
Error compiling shader!: …Run Code Online (Sandbox Code Playgroud) 我正在将我的代码从OpenGL 3.0升级到3.3(或者甚至可能是4.x),但我遗漏了一些东西,因为屏幕是黑色的.
这个问题最接近的答案是openGL 3.1中的三角形,但3.2中没有.这里的解决方案是使用兼容性配置文件.使用核心配置文件实现正确的唯一提示是"实际使用具有完整顶点和片段着色器的适当核心配置文件GL命令序列".
我遇到的问题是,在整个下午阅读规范,教程和示例后,我看不出我的代码出错了.我目前正在开发一个演示程序来回收我使用的一些代码,你可以找到整个演示,目前只是在gitub渲染一个三角形.
多汁的比特如下:
顶点代码是:
#version 150
in vec3 aVertex;
void main()
{
gl_Position = aVertex;
}
Run Code Online (Sandbox Code Playgroud)
片段代码是:
#version 330 core
out vec4 oFragColor;
void main()
{
oFragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
编译着色器的过程如下:
int status = 0;
char logstr[256];
const GLchar* vbuff[1] = {vertex_code.c_str()};
unsigned int vertex_id = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_id, 1, vbuff, NULL);
glCompileShader(vertex_id);
glGetShaderInfoLog(vertex_id, 256, NULL, logstr);
glGetShaderiv(vertex_id, GL_COMPILE_STATUS, &status);
if(! status)
{
glDeleteShader(vertex_id);
throw std::runtime_error(logstr);
} …Run Code Online (Sandbox Code Playgroud) 我一直在阅读一本关于OpenGL的书,上面写着你可以使用GLSLshader :: operator []和我希望该位置获取该位置的属性的名称.但是当我使用它时(例子如下),程序崩溃了.
GLuint program_id;
...
glLinkProgram(program_id);
...
...
...
glEnableVertexAttribArray(program_id["position");
glVertexAttribPointer(program_id["position"], ... );
Run Code Online (Sandbox Code Playgroud)
当我调试它时返回105,即使我希望它返回0.我已指定该位置应为0,当我硬编码时,它按预期工作:
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ... );
Run Code Online (Sandbox Code Playgroud)
这是顶点着色器的行:
layout(location = 0) in vec3 position;
Run Code Online (Sandbox Code Playgroud)
我不确定我是否误解了如何使用它.到目前为止,我总是硬编码属性位置,但我希望能够这样做.我知道我也可以用
glGetAttribLocation(program_id, "position");
Run Code Online (Sandbox Code Playgroud)
这工作(它返回我指定的位置),但着色器["位置"]看起来更清晰,如果使用[]运算符是一种方法,我想知道如何做而不是只是找到一个努力使其发挥作用.
所以我的问题是你可以使用GLSLshader :: operator []如shader ["position"]来获取属性的位置吗?如果是这样,你能想到我可能正在做的那些使它无效吗?
我正在尝试在OpenGL中渲染一些对象,但即使我glDrawElements用正确的模式调用它,它仍然给了我一个GL_INVALID_ENUM.这是AMD的CodeXL记录的呼叫记录,从设置到渲染:
glBindVertexArray(1)
... creating shaders/programs and getting uniform locations ...
# the vertex buffer
glGenBuffers(1, 0x008A945C)
glBindBuffer(GL_ARRAY_BUFFER, 1)
glBufferData(GL_ARRAY_BUFFER, 96, 0x008A94A0, GL_STATIC_DRAW)
# the element index buffer
glGenBuffers(1, 0x008A9460)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 96, 0x008A9508, GL_STATIC_DRAW)
glClearColor(0.12, 0.63999999, 0.55000001, 1)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glEnableVertexAttribArray(0)
glUseProgram(1)
glUniformMatrix4fv(0, 1, FALSE, ... MVP Matrix ...)
glBindBuffer(GL_ARRAY_BUFFER, 1)
glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 0x00000000)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, 0x00000000) # GL_INVALID_ENUM here <----
glUseProgram(0)
glDisableVertexAttribArray(0)
wglSwapBuffers(0x09011214)
Run Code Online (Sandbox Code Playgroud)
我已经尝试换glDrawElements用glDrawArrays(GL_QUADS, …
我实际上学习了一些OpenGL,我设法加载网格并在窗口中显示它.然后我用SDL做了一个函数,让我用箭头键旋转网格.但是当我潜入Shaders时我做了一些改变,但我不能为3D模型进行简单的旋转.
这是我的绘图功能:
glMatrixMode(GL_MODELVIEW); //set the matrix to model view mode
glPushMatrix(); // push the matrix
glRotatef(1.0,0.0,0.0,1.0); //apply transformation
//Primer buffer, modelo
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
glEnableVertexAttribArray(0);
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0,vertices.size());
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glPopMatrix();//pop the matrix
glMatrixMode(GL_PROJECTION); // Apply projection matrix again
Run Code Online (Sandbox Code Playgroud)
Theese是我的着色器:
片段着色器(仅用于给出颜色)
#version 130
out vec3 color;
void main()
{
color = vec3(0.0,0.5,1.0);
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器(用它来乱搞并尝试):
#version 130
in vec3 vertexPosition;
void main()
{
gl_Position.x = vertexPosition.x;
gl_Position.y = vertexPosition.y-1.0;
gl_Position.z = vertexPosition.z;
gl_Position.w = 1.0; …Run Code Online (Sandbox Code Playgroud) 我是openGl的初学者.你能告诉我一下吗?
glTranslatef();
glScalef();
glBegin ();
Run Code Online (Sandbox Code Playgroud)
我在谷歌搜索过它们但无法得到答案.
谢谢
我正在使用OpenGL,并且我正在使用的版本存在一些问题.当我检查我的版本时glGetString(GL_VERSION),我得到"4.2.0 - Build 10.18.10.3574".我有以下问题:
在一种方法中,我使用固定管道进行渲染,但我知道从OpenGL 3.1中删除了对固定管道的支持,那么我的代码如何与4.2一起工作?我使用的API一样glTranslatef(),glMatrixMode(GL_PROJECTION).我认为这些都已弃用,仅适用于OpenGL 1.1.那么当我将上下文字符串作为OpenGL 4.2时,代码是如何工作的?我想我必须使用OpenGL 1.1,但为什么上下文版本是4.2?
当我使用着色器时,我使用以下代码创建3.1或更高版本的上下文.我使用的着色器是旧的着色器,它与OpenGL 2.0兼容,并且具有"属性","变化"等关键字,不应与OpenGL 3.1或更高版本一起使用.我应该将我的着色器更新为OpenGLSL 3.1,比如使用"in","out"等.还有一些不赞成的东西,比如GL_LINE_SMOOTH_HINT,glMatrixMode(GL_PROJECTION).我认为这些东西已经从OpenGL 3.0中弃用了.那么这些东西如何与GL上下文3.1及更高版本一起使用?
创建上下文3.1或更高版本的代码
if ( 0 == (m_tempContext = ::wglCreateContext( m_pDC->GetSafeHdc() ) ) )
{
AfxMessageBox(_T("wglCreateContext failed."));
return FALSE;
}
if ( FALSE == ::wglMakeCurrent( m_pDC->GetSafeHdc(), m_tempContext ) )
{
AfxMessageBox(_T("wglMakeCurrent failed."));
return FALSE;
}
int attribs[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 1,
WGL_CONTEXT_FLAGS_ARB, 0,
0
};
if(wglewIsSupported("WGL_ARB_create_context") == 1)
{
m_hRC = wglCreateContextAttribsARB(m_pDC->GetSafeHdc() ,0, attribs); …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我需要通过glUseProgram(程序)在两个GLSL程序之间切换.我想知道我是否写道:
glUseProgram(program1)
buf1 = glGenBuffers(1)
glUseProgram(program2)
buf2 = glGenBuffers(1)
Run Code Online (Sandbox Code Playgroud)
buf1和buf2可以是相同的值吗?即每个程序都有自己的缓冲区,还是共享缓冲区?
以下片段着色器有什么问题?它可以在GLSL 4.0下编译正常,但在GLSL 1.30上失败。
这是代码:
// Fragment Shader
"uniform sampler2D texture;\n"
"uniform sampler1D cmap;\n"
"uniform float minZ;\n"
"uniform float maxZ;\n"
"\n"
"void main() {\n"
" float height = texture2D(texture,gl_TexCoord[0].st);\n"
" float lum = (height-minZ)/(maxZ-minZ);\n"
" if (lum > 1.0) lum = 1.0;\n"
" else if (lum < 0.0) lum = 0.0;\n"
" gl_FragColor = texture1D(cmap, lum);\n"
"}"
Run Code Online (Sandbox Code Playgroud)
这些是错误:
FRAGMENT glCompileShader "" FAILED
FRAGMENT Shader "" infolog:
0:7(2): error: initializer of type vec4 cannot be assigned to variable of type float
0:8(2): …Run Code Online (Sandbox Code Playgroud) 我有一个围绕y轴旋转的3个顶点三角形.我发现"怪异"的一件事是GL默认正交投影中的归一化坐标.我使用过像SDL和SFML这样的二维库,几乎总是处理像素.你说你想要一个50x50像素的图像表面,这就是你得到的.所以最初我很难说从[-1,1]中限制我的顶点位置选择.
为什么正交坐标必须标准化?透视投影是否相同?如果是这样,你怎么说你希望你的对象的原点在z = -10?(我快速浏览矩阵m ath说透视是不同的.关于除以'w'创建同质(与标准化相同的东西?)坐标的东西,但我不确定).
gl_Position = View*Model*Project*Vertex;
我已经看到上面的等式,我很惊讶于着色器中使用的变量gl_Position如何既可以表示模型/对象的当前顶点的位置,又可以表示视图/投影的位置,或者相机.这是如何运作的?我通过乘法理解所有信息都存储在一个矩阵中,但OpenGL如何使用一个矩阵,其信息现在被组合起来说,"好吧,gl_Position的这部分/分数用于摄像机,而另一部分是信息该模型将要去哪里."?(顺便说一句,我不太确定Vertex vec4代表什么.我认为模型的所有顶点都在模型内部.任何想法?
还有一个问题,如果你只是想移动相机,例如在FPS游戏中你移动鼠标向上移动,但是除了相机之外没有任何物体被旋转或翻译(我认为),上面的等式会看起来像什么像这样?
gl_Position =查看*项目;