Opengl es 如果我没有提到gl_顶点,GLSL顶点着色器会给出错误的结果

Opengl es 如果我没有提到gl_顶点,GLSL顶点着色器会给出错误的结果,opengl-es,opengl-es-2.0,glsl,Opengl Es,Opengl Es 2.0,Glsl,我正在编写一个着色器来绘制具有一定宽度的线,作为glLineWidth的替代,glLineWidth在角度大于1.0时不起作用,我希望我的线在窗口上具有相同的厚度。不过,我现在正在桌面OpenGL上运行 顶点着色器源如下所示 attribute vec3 a_startPosition; attribute vec3 a_endPosition; attribute float a_choice; attribute float a_dir; uniform mat4 u_mvpMatrix;

我正在编写一个着色器来绘制具有一定宽度的线,作为glLineWidth的替代,glLineWidth在角度大于1.0时不起作用,我希望我的线在窗口上具有相同的厚度。不过,我现在正在桌面OpenGL上运行

顶点着色器源如下所示

attribute vec3 a_startPosition;
attribute vec3 a_endPosition;
attribute float a_choice;
attribute float a_dir;
uniform mat4 u_mvpMatrix;
uniform float u_width;
uniform vec2 u_viewDims;

void main()
{
    vec4 start = u_mvpMatrix*vec4(a_startPosition, 1.0);
    vec4 end = u_mvpMatrix*vec4(a_endPosition, 1.0);

    //gl_Vertex;

    vec2 slope = normalize(end.xy - start.xy);
    slope = vec2(slope.y, -slope.x);
    vec2 scale = u_width/u_viewDims;

    if (a_choice == 0.0)
        gl_Position = vec4(start.xy + a_dir*scale*slope.xy*start.w, start.zw);
    else
        gl_Position = vec4(end.xy + a_dir*scale*slope.xy*end.w, end.zw);
}
请注意,我有gl_顶点,未使用,已注释掉

int width, height;
glfwGetFramebufferSize(m_window, &width, &height);

glUseProgram(m_shaders[Shader_WideLine]->id());
GLint shaderid = m_shaders[Shader_WideLine]->id();

GLint coloc = glGetUniformLocation(shaderid, "Color");
GLint dimloc = glGetUniformLocation(shaderid, "u_viewDims");
GLint widthloc = glGetUniformLocation(shaderid, "u_width");
GLint mvploc = glGetUniformLocation(shaderid, "u_mvpMatrix");
GLint modelviewloc = glGetUniformLocation(shaderid, "u_modelview");
GLint projloc = glGetUniformLocation(shaderid, "u_projection");

GLint dirloc = glGetAttribLocation(shaderid, "a_dir");
GLint startloc = glGetAttribLocation(shaderid, "a_startPosition");
GLint endloc = glGetAttribLocation(shaderid, "a_endPosition");
GLint chloc = glGetAttribLocation(shaderid, "a_choice");

//////////
//Set Uniforms
//////////
glUniform1f(widthloc, 10);
glUniform2f(dimloc, width, height);
glUniform4f(coloc, 0.101f, 0.558f, 0.109f, 1.f);

glm::mat4 modelview;
glm::mat4 projection;
glGetFloatv(GL_MODELVIEW_MATRIX, glm::value_ptr(modelview));
glGetFloatv(GL_PROJECTION_MATRIX, glm::value_ptr(projection));

glm::mat4 mvp = projection * modelview;
glUniformMatrix4fv(mvploc, 1, GL_FALSE, glm::value_ptr(mvp));

int numpts = 4;
GLfloat v[4][3] = {
    {0,1,0},
    {0,0,0},
    {1,0,0},
    {1,1,0}
};
//////////
// Draw (attributes)
//////////
glBegin( GL_TRIANGLE_STRIP ); 

glNormal3d(0.0, 0.0, 1.0); 

for(int i=0; i<numpts-1; i++)
{
    glVertexAttrib3fv(startloc, v[i]);
    glVertexAttrib3fv(endloc, v[i+1]);

    glVertexAttrib1f(chloc, 0);

    glVertexAttrib1f(dirloc, -1.0f);
    glVertex3d(0,0,0);

    glVertexAttrib1f(dirloc, 1.0f);
    glVertex3d(0,0,0);

    glVertexAttrib1f(chloc, -1);
    glVertexAttrib1f(dirloc, -1.0f);
    glVertex3d(0,0,0);
    glVertexAttrib1f(dirloc, 1.0f);
    glVertex3d(0,0,0);

}

glEnd();
glUseProgram(0);
int宽度、高度;
glfwGetFramebufferSize(m_窗口、宽度和高度);
glUseProgram(m_着色器[Shader_WideLine]->id());
GLint shaderid=m_着色器[Shader_WideLine]->id();
GLint coloc=glGetUniformLocation(shaderid,“颜色”);
GLint dimloc=glGetUniformLocation(shaderid,“u_viewDims”);
闪烁宽度loc=glGetUniformLocation(shaderid,“u_宽度”);
GLint mvploc=glGetUniformLocation(shaderid,“u_mvpMatrix”);
GLint modelviewloc=glGetUniformLocation(shaderid,“u_modelview”);
GLint projloc=glGetUniformLocation(shaderid,“u_投影”);
GLint dirloc=glGetAttribLocation(shaderid,“a_dir”);
GLint STARTOC=GLGETARTIBLOCATION(shaderid,“a_startPosition”);
GLint endloc=glGetAttribLocation(shaderid,“a_endPosition”);
GLint chloc=glGetAttribLocation(shaderid,“a_选项”);
//////////
//固定制服
//////////
glUniform1f(10);
glUniform2f(dimloc、宽度、高度);
glUniform4f(coloc,0.101f,0.558f,0.109f,1.f);
glm::mat4模型视图;
glm::mat4投影;
glGetFloatv(GL_MODELVIEW_矩阵,glm::value_ptr(MODELVIEW));
glGetFloatv(GL_投影矩阵,glm::value_ptr(投影));
glm::mat4 mvp=投影*模型视图;
glUniformMatrix4fv(mvploc,1,GL_假,glm::value_ptr(mvp));
int numpts=4;
GLV[4][3]={
{0,1,0},
{0,0,0},
{1,0,0},
{1,1,0}
};
//////////
//绘制(属性)
//////////
glBegin(GLU三角带);
glNormal3d(0.0,0.0,1.0);

for(int i=0;i
gl_ModelViewProjectionMatrix
不是有效的ES 2.0顶点着色器内置变量


您必须通过制服传递MVP。

好的,我更新为通过制服传递MVP,并添加了调用代码和图片来描述错误。