コード例 #1
0
ファイル: composeshader.cpp プロジェクト: Just-D/skia
    void onDraw(SkCanvas* canvas) override {
        SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(SkXfermode::kDstOver_Mode));

        // gradient should appear over color bitmap
        SkAutoTUnref<SkShader> shader0(new SkComposeShader(fLinearGradientShader,
                                                           fColorBitmapShader,
                                                           xfer));
        // gradient should appear over alpha8 bitmap colorized by the paint color
        SkAutoTUnref<SkShader> shader1(new SkComposeShader(fLinearGradientShader,
                                                           fAlpha8BitmapShader,
                                                           xfer));

        SkShader* shaders[] = { shader0.get(), shader1.get() };

        SkPaint paint;
        paint.setColor(SK_ColorYELLOW);

        const SkRect r = SkRect::MakeXYWH(0, 0, SkIntToScalar(squareLength),
                                          SkIntToScalar(squareLength));

        for (size_t y = 0; y < SK_ARRAY_COUNT(shaders); ++y) {
            SkShader* shader = shaders[y];
            canvas->save();
            for (int alpha = 0xFF; alpha > 0; alpha -= 0x28) {
                paint.setAlpha(alpha);
                paint.setShader(shader);
                canvas->drawRect(r, paint);

                canvas->translate(r.width() + 5, 0);
            }
            canvas->restore();
            canvas->translate(0, r.height() + 5);
        }
    }
コード例 #2
0
ファイル: composeshader.cpp プロジェクト: Just-D/skia
    void onDraw(SkCanvas* canvas) override {
        SkAutoTUnref<SkShader> shader0(make_shader(SkXfermode::kDstIn_Mode));
        SkAutoTUnref<SkShader> shader1(make_shader(SkXfermode::kSrcOver_Mode));
        SkShader* shaders[] = { shader0.get(), shader1.get() };

        SkPaint paint;
        paint.setColor(SK_ColorGREEN);

        const SkRect r = SkRect::MakeXYWH(5, 5, 100, 100);

        for (size_t y = 0; y < SK_ARRAY_COUNT(shaders); ++y) {
            SkShader* shader = shaders[y];
            canvas->save();
            for (int alpha = 0xFF; alpha > 0; alpha -= 0x28) {
                paint.setAlpha(0xFF);
                paint.setShader(nullptr);
                canvas->drawRect(r, paint);

                paint.setAlpha(alpha);
                paint.setShader(shader);
                canvas->drawRect(r, paint);

                canvas->translate(r.width() + 5, 0);
            }
            canvas->restore();
            canvas->translate(0, r.height() + 5);
        }
    }
コード例 #3
0
    void canDetachAllShaders()
    {
        ShaderProgram shaderProgram;
        Shader shader1(Shader::VERTEX_SHADER);
        Shader shader2(Shader::FRAGMENT_SHADER);

        QVERIFY(shaderProgram.attach(shader1));
        QVERIFY(shaderProgram.attach(shader2));

        QVERIFY(shaderProgram.has(shader1));
        QVERIFY(shaderProgram.has(shader2));

        shaderProgram.detachAllShaders();

        QVERIFY(!shaderProgram.has(shader1));
        QVERIFY(!shaderProgram.has(shader2));
    }
コード例 #4
0
//--------------------------------------------------------------------------
void GLShadersTests::tests()
{
  GLVertexShader shader1("vert");
  CPPUNIT_ASSERT(shader1.name() == "vert");
  CPPUNIT_ASSERT(GL_VERTEX_SHADER == shader1.target());

  GLFragmentShader shader2("frag");
  CPPUNIT_ASSERT(shader2.name() == "frag");
  CPPUNIT_ASSERT(GL_FRAGMENT_SHADER == shader2.target());

  GLGeometryShader shader3;
  CPPUNIT_ASSERT(shader3.name() == "");
  CPPUNIT_ASSERT(GL_GEOMETRY_SHADER == shader3.target());

  //--- Check initial state
  CPPUNIT_ASSERT(shader1.m_shader_code == "");
  CPPUNIT_ASSERT(shader1.m_error_msg == "");
  CPPUNIT_ASSERT(!shader1.m_compiled);
  CPPUNIT_ASSERT(0 == shader1.m_attached);

  //--- Check initial state
  CPPUNIT_ASSERT(shader2.code() == "");
  CPPUNIT_ASSERT(shader2.error() == "");
  CPPUNIT_ASSERT(!shader2.hasErrored());
  CPPUNIT_ASSERT(!shader2.compiled());
  CPPUNIT_ASSERT(0 == shader2.m_attached);

  //--- Load from string
  shader1.fromString("foobar");
  CPPUNIT_ASSERT(!shader1.hasErrored());
  CPPUNIT_ASSERT(shader1.code() == "foobar");
  CPPUNIT_ASSERT(shader1.loaded());
  CPPUNIT_ASSERT(!shader1.compiled());
  try {
    shader1.throw_if_not_loaded();
  } catch(...) { CPPUNIT_FAIL("Exception should have not occured"); }

  try {
    shader1.throw_if_already_compiled();
    CPPUNIT_FAIL("Exception should have occured");
  } catch(...) { }

  shader1.fromString("");
  CPPUNIT_ASSERT(!shader1.hasErrored());
  CPPUNIT_ASSERT(shader1.code() == "");
  CPPUNIT_ASSERT(!shader1.loaded());
  CPPUNIT_ASSERT(!shader1.compiled());

  //--- Load from wrong file
  CPPUNIT_ASSERT(shader3.code() == "");
  CPPUNIT_ASSERT(!shader3.fromFile("this_file_does_not_exist"));
  CPPUNIT_ASSERT(!shader3.compiled());
  CPPUNIT_ASSERT(shader3.hasErrored());
  CPPUNIT_ASSERT(shader3.code() == "");
  CPPUNIT_ASSERT(!shader3.compiled());
  CPPUNIT_ASSERT(shader3.error() != "");
  CPPUNIT_ASSERT(!shader3.hasErrored());
  try {
    shader3.throw_if_not_loaded();
    CPPUNIT_FAIL("Exception should have occured");
  } catch(...) {  }
  try {
    shader3.throw_if_already_compiled();
  } catch(...) { CPPUNIT_FAIL("Exception should have not occured"); }
  shader3.m_need_setup = false;
  try {
    shader3.throw_if_already_compiled();
    CPPUNIT_FAIL("Exception should have occured");
  } catch(...) { }

  //---
  shader2.attachProg(0);
  CPPUNIT_ASSERT_EQUAL(0u, shader2.attached());
  shader2.attachProg(42);
  CPPUNIT_ASSERT_EQUAL(42u, shader2.attached());

  //--- Try setup
  shader1.m_error_msg = "";
  shader1.fromString(""); shader1.m_compiled = true;
  shader1.setup();
  CPPUNIT_ASSERT(shader1.hasErrored());
  CPPUNIT_ASSERT(shader1.error() != "");
  shader1.setup();

  //--- Try setup
  shader1.m_error_msg = "";
  shader1.fromString("ff"); shader1.m_compiled = true;
  shader1.setup();
  CPPUNIT_ASSERT(shader1.hasErrored());
  CPPUNIT_ASSERT(shader1.error() != "");
  shader1.setup();


  // TODO shader1.begin();
}
コード例 #5
0
ファイル: main.cpp プロジェクト: Xywzel/graffathon16
int main(int argc, char** argv){
  // Set interactive mode for debugging the program when started with arguments
  bool interactive = false;
  if(argc > 1) interactive = true;

  // Initialize GLFW
  if (!glfwInit()) fatalError("GLFW could not be initialized");
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

  // Create window
  GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, NAME, NULL, NULL);
  if (window == NULL) fatalError("Failed to create GLFW window");
  glfwMakeContextCurrent(window);

  // Controls
  glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
  glfwSetKeyCallback(window, keycallback);

  // Start GLEW
  glewExperimental = GL_TRUE;
  if (glewInit() != GLEW_OK) fatalError("Failed to initialize GLEW");
  glViewport(0, 0, WIDTH, HEIGHT);

  // Load shaders
  Shader shader1("shaders/basic.vertex", "shaders/basic.frag");
  shader1.use();
  glUniform1f(glGetUniformLocation(shader1.program, "first"), FIRST);
  glUniform1f(glGetUniformLocation(shader1.program, "second"), SECOND);
  glUniform1f(glGetUniformLocation(shader1.program, "third"), THIRD);

  Shader shader2("shaders/basic.vertex", "shaders/advanced.frag");

  // Raster scene settings
  Camera camera(glm::vec3(0.0f, 0.0f, 3.0f), -90.0f, 0.0f);
  GLfloat vertices[] = {
    -1.0f, -1.0f, 0.0f, -1.0f, -1.0f,
     1.0f, -1.0f, 0.0f,  1.0f, -1.0f,
    -1.0f,  1.0f, 0.0f, -1.0f,  1.0f,
     1.0f,  1.0f, 0.0f,  1.0f,  1.0f
  };
  GLuint indices[] = {
    0, 1, 2,
    2, 1, 3
  };

  GLuint VAO, VBO, EBO;
  glGenVertexArrays(1, &VAO);
  glBindVertexArray(VAO);

  glGenBuffers(1, &VBO);
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);
  glEnableVertexAttribArray(0);
  glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*) (3* sizeof(GLfloat)));
  glEnableVertexAttribArray(1);

  glGenBuffers(1, &EBO);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

  glBindVertexArray(0);

  // FPS counter
  bool isTicking = true;
  int fpscount = 0;
  GLfloat fpstime = 0.0f;

  // Frame timings
  GLfloat timeFromStart = START;
  GLfloat lastFrame = (GLfloat) glfwGetTime();
  GLfloat thisFrame = (GLfloat) glfwGetTime();
  GLfloat deltaTime = thisFrame - lastFrame;

  Shader shader = shader1;
  int shaderNum = 1;

  while(!glfwWindowShouldClose(window)){
    thisFrame = (GLfloat) glfwGetTime();
    deltaTime = thisFrame - lastFrame;
    if(isTicking){
      timeFromStart += deltaTime;
      fpscount++;
      fpstime += deltaTime;
      if(fpstime > 1.0f) {
        if(FPSlog){
          std::cout << "FPS: " << (GLfloat) fpscount /  fpstime << std::endl;
        }
        fpstime = 0.0f;
        fpscount = 0;
      }
    }

    // Handle Inputs if we are in interactive mode
    //if (interactive) {
    glfwPollEvents();
    handleKeys(window, timeFromStart, isTicking, shader);
    //}


    glClearColor(0.05f, 0.05f, 0.05f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glm::mat4 model;
    model = glm::scale(model, glm::vec3(SCALE, SCALE, SCALE));
    glm::mat4 view;
    view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
    glm::mat4 proj = glm::perspective(glm::radians(45.0f), (GLfloat) WIDTH / (GLfloat) HEIGHT, 0.1f, 100.0f);
    glm::mat4 trans = proj * view * model;

    if(timeFromStart > 40.0f && shaderNum == 1) {
      shader = shader2;
      shaderNum++;
    }

    shader.use();

    glUniform1f(glGetUniformLocation(shader.program, "time"), timeFromStart);
    glUniformMatrix4fv(glGetUniformLocation(shader.program, "transform"), 1, GL_FALSE, glm::value_ptr(trans));
    glBindVertexArray(VAO);
    // Draw
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    glBindVertexArray(0);
    glfwSwapBuffers(window);
    lastFrame = thisFrame;
  }
  glfwTerminate();
  return 0;
}