/*
 * Load the vertex shader `vshader` and the fragment shader
 * `fshader`, compiles them and links them to the shader program.
 * Outputs warnings and compilation errors should an error occur.
 */
void GLWidgetContext::loadShaders(QString vstring, QString fstring, QOpenGLShader *vshader, QOpenGLShader *fshader, QOpenGLShaderProgram *prog)
{
	QFileInfo vsh(vstring);
	if (vsh.exists()) {
		vshader = new QOpenGLShader(QOpenGLShader::Vertex);
		if (vshader->compileSourceFile(vstring)) {
			prog->addShader(vshader);
		} else {
			qWarning() << "Vertex shader error" << vshader->log();
		}
	} else {
		qWarning() << "Vertex shader source file " << vstring << " not found.";
	}

	QFileInfo fsh(fstring);
	if (fsh.exists()) {
		fshader = new QOpenGLShader(QOpenGLShader::Fragment);
		if (fshader->compileSourceFile(fstring)) {
			prog->addShader(fshader);
		} else {
			qWarning() << "Fragment shader error" << fshader->log();
		}
	} else {
		qWarning() << "Fragment shader source file " << fstring << " not found.";
	}

	prog->link();
}
void QGLRenderThread::LoadShader(QString vshader, QString fshader)
{
    if(ShaderProgram)
        {
        ShaderProgram->release();
        ShaderProgram->removeAllShaders();
        }
    else ShaderProgram = new QGLShaderProgram;

    if(VertexShader)
        {
        delete VertexShader;
        VertexShader = NULL;
        }

    if(FragmentShader)
        {
        delete FragmentShader;
        FragmentShader = NULL;
        }

    // load and compile vertex shader
    QFileInfo vsh(vshader);
    if(vsh.exists())
        {
        VertexShader = new QGLShader(QGLShader::Vertex);

        if(VertexShader->compileSourceFile(vshader))
        {
            ShaderProgram->addShader(VertexShader);
        }
        else qWarning() << "Vertex Shader Error" << VertexShader->log();
        }
    else qWarning() << "Vertex Shader source file " << vshader << " not found.";


    // load and compile fragment shader
    QFileInfo fsh(fshader);
    if(fsh.exists())
        {
        FragmentShader = new QGLShader(QGLShader::Fragment);
        if(FragmentShader->compileSourceFile(fshader))
            ShaderProgram->addShader(FragmentShader);
        else qWarning() << "Fragment Shader Error" << FragmentShader->log();
        }
    else qWarning() << "Fragment Shader source file " << fshader << " not found.";

    if(!ShaderProgram->link())
        {
        qWarning() << "Shader Program Linker Error" << ShaderProgram->log();
        }
    else ShaderProgram->bind();
}
void GLWidgetContext::loadShaders(QString vstring, QString fstring, QString tcstring, QString testring, QOpenGLShader *vshader, QOpenGLShader *fshader, QOpenGLShader *tcshader, QOpenGLShader *teshader, QOpenGLShaderProgram *prog)
{
	QFileInfo vsh(vstring);
	if (vsh.exists()) {
		vshader = new QOpenGLShader(QOpenGLShader::Vertex);
		if (vshader->compileSourceFile(vstring)) {
			prog->addShader(vshader);
		} else {
			qWarning() << "Vertex shader error" << vshader->log();
		}
	} else {
		qWarning() << "Vertex shader source file " << vstring << " not found.";
	}

	QFileInfo fsh(fstring);
	if (fsh.exists()) {
		fshader = new QOpenGLShader(QOpenGLShader::Fragment);
		if (fshader->compileSourceFile(fstring)) {
			prog->addShader(fshader);
		} else {
			qWarning() << "Fragment shader error" << fshader->log();
		}
	} else {
		qWarning() << "Fragment shader source file " << fstring << " not found.";
	}

	QFileInfo tcsh(tcstring);
	if (tcsh.exists()) {
		tcshader = new QOpenGLShader(QOpenGLShader::TessellationControl);
		if (tcshader->compileSourceFile(tcstring)) {
			prog->addShader(tcshader);
		} else {
			qWarning() << "Tessellation control shader error" << tcshader->log();
		}
	} else {
		qWarning() << "Tesselation control source file " << tcstring << " not found.";
	}

	QFileInfo tesh(testring);
	if (tesh.exists()) {
		teshader = new QOpenGLShader(QOpenGLShader::TessellationEvaluation);
		if (teshader->compileSourceFile(testring)) {
			prog->addShader(teshader);
		} else {
			qWarning() << "Tessellation evaluation shader error" << teshader->log();
		}
	} else {
		qWarning() << "Tesselation evaluation source file " << testring << " not found.";
	}

	prog->link();
}
Example #4
0
void GLWidget::loadShaders(QGLShaderProgram* program, QString vShaderFileName, QString fShaderFileName)
{
    QGLShader* vertexShader = NULL;
    QGLShader* fragmentShader = NULL;

    QFileInfo vsh(vShaderFileName);
    if(vsh.exists()) {
        vertexShader = new QGLShader(QGLShader::Vertex);
        if(vertexShader->compileSourceFile(vShaderFileName)) {
            program->addShader(vertexShader);
            qDebug() << "Vertex shader compiled successfully.";
        }
        else {
            qWarning() << "Vertex Shader Error" << vertexShader->log();
        }
    }
    else {
        qWarning() << "Vertex Shader source file " << fShaderFileName << " not found.";
    }

    QFileInfo fsh(fShaderFileName);
    if(fsh.exists()) {
        fragmentShader = new QGLShader(QGLShader::Fragment);
        if(fragmentShader->compileSourceFile(fShaderFileName)) {
            program->addShader(fragmentShader);
            qDebug() << "Fragment shader compiled successfully.";
        }
        else {
            qWarning() << "Fragment Shader Error" << fragmentShader->log();
        }
    }
    else {
        qWarning() << "Fragment Shader source file " << fShaderFileName << " not found.";
    }

    if(!program->link()){
        qWarning() << "Shader Program Linker Error" << program->log();
    }

}
Example #5
0
nuResource::ERROR_CODE nuShaderList::setup(const nuStream &stream)
{
  if(stream.getSize() == 0)
    return ERROR_INVALID;

  nude::TempBuffer<> temp(stream.getSize());
  if(!temp.getBuffer())
    return ERROR_INSUFFICIENT_MEMORY;

  if(stream.read(temp.getBuffer(), temp.getSize()) != temp.getSize())
    return ERROR_READ_FAIL;

  c8 shader_path[PATH_MAX];
  c8* file_name = shader_path;
  const c8* p_curr = static_cast< c8* >(temp.getBuffer());
  size_t remain = temp.getSize();
  size_t path_cmd_len = strlen("SHADER_PATH");
  bool end = false;
  for(ui32 ui = 0; ui < static_cast< ui32 >(temp.getSize()) && !end; ui++) {
    switch(p_curr[ui]) {
    case 0x0a:
    case 0x0d:
    case ' ':
    case '\t':
      break;
    case '#':
      do {
        ui++;
        remain--;
      } while(p_curr[ui] != 0x0a && p_curr[ui] != 0x0d);
      break;
    default:
      if(remain > path_cmd_len && strncmp(&p_curr[ui], "SHADER_PATH", path_cmd_len) == 0) {
        ui += path_cmd_len;
        remain -= path_cmd_len;
        c8* pc = shader_path;
        for(ui32 uj = ui; uj < static_cast< ui32 >(temp.getSize()) && !end; uj++) {
          switch(p_curr[uj]) {
          case ' ':
          case '\t':
          case '=':
            break;
          case '"':
            uj++;
            remain--;
            while(p_curr[uj] != '"' && remain > 0) {
              *pc = p_curr[uj];
              pc++;
              uj++;
              remain--;
            }
            if(pc != shader_path && pc[-1] != '/') {
              *pc = '/';
              pc++;
            }
            *pc = 0x00;
            NU_TRACE("Shader path: %s\n", shader_path);
            file_name = pc;
            end = true;
            break;
          default:
            return ERROR_INVALID;
          }
          remain--;
        }
      } else {
        return ERROR_INVALID;
      }
    }
  }

  size_t max_fname = PATH_MAX - strlen(shader_path);

  for(ui32 ui = 0; ui < nude::ProgramList_Num; ui++) {
    const nude::Program& prog = nude::GLSLPrograms[ui];
    Data& data = mData[ui];

    data.attribute = 0;

    if(prog.vsh_file) {
      snprintf(file_name, max_fname, "%s", prog.vsh_file);
      file_name[max_fname - 1] = 0x00;
      NU_TRACE("Reading VSH: %s\n", shader_path);

      nuFile vsh(nude::FATTR_READ, shader_path);
      if(vsh.isOpened()) {
        data.vsh_size = vsh.getSize();
        data.vsh_data = nude::Alloc(data.vsh_size);
        vsh.read(data.vsh_data, data.vsh_size);
      }
    } else {
      data.vsh_data = nullptr;
      data.vsh_size = 0;
    }

    if(prog.fsh_file) {
      snprintf(file_name, max_fname, "%s", prog.fsh_file);
      file_name[max_fname - 1] = 0x00;
      NU_TRACE("Reading FSH: %s\n", shader_path);

      nuFile fsh(nude::FATTR_READ, shader_path);
      if(fsh.isOpened()) {
        data.fsh_size = fsh.getSize();
        data.fsh_data = nude::Alloc(data.fsh_size);
        fsh.read(data.fsh_data, data.fsh_size);
      }
    } else {
      data.fsh_data = nullptr;
      data.fsh_size = 0;
    }
  }

  return ERROR_NONE;
}